发 帖  
原厂入驻New
modelsim仿真累加器时,已对输入值yout、y_ou、y_out初始化,但仿真结果显示中间量y_out没能读入,始终是不定态的原因?
239 modelsim
分享
本帖最后由 区幺幺 于 2020-6-30 21:24 编辑

照大佬给的答案在累加器代码里增加了对y_out,y_ou的初始化
  1.   always @(posedge res or posedge clk)

  2.    begin

  3.       IF (res == 1'b1)

  4.       begin

  5.          youtput <= 9'b000000000;

  6.          y_out   <= 9'b000000000;

  7.          y_ou    <= 9'b000000000;
  8.       end
复制代码

仿真结果如图,

中间量y_out始终为不定态,没有被读入。并且看到y_ou的值也没有按顺序(0,1,2,3,4,5)被正确读入。现在是0,2,5,1,4
参考论文的结果如下图:
累加2.png
现在使用的代码如下,modelsim版本是ModelSim-altera 6.5b (Quartus II 9.1sp2) Starter Edition。Verilog小菜鸡,跪求大佬赐教
  1. [align=left]////////////////////add///////////////////////////[/align][align=left]module add(clk, res, yout, youtput);[/align][align=left]   input        clk;[/align][align=left]   input        res;[/align][align=left]   input [8:0]  yout;[/align][align=left]   output reg [8:0] youtput;[/align][align=left]   reg [8:0]    y_out;[/align][align=left]   reg [8:0]    y_ou;[/align][align=left]   [/align][align=left]   always @(posedge res or posedge clk)[/align][align=left]   begin[/align][align=left]      if (res == 1'b1)[/align][align=left]      begin[/align][align=left]         youtput <= 9'b000000000;[/align][align=left]         y_out   <= 9'b000000000;[/align][align=left]         y_ou    <= 9'b000000000;[/align][align=left]         [/align][align=left]      end[/align][align=left]      else [/align][align=left]      begin[/align][align=left]         y_ou       <=        yout  ;[/align][align=left]         y_out      <= y_ou + y_out ;[/align][align=left]         youtput    <=        y_out ;[/align][align=left]      end[/align][align=left]   end[/align][align=left]   [/align][align=left]endmodule[/align]
复制代码
/////////////////testbench////////////////////////////
`timescale 1ns / 1ps

module add_tb  ;

  reg           res         ;
  reg           clk         ;
  reg  [8:0]    yout        ;
  wire [8:0]    youtput     ;
  
  initial//
  begin
        res = 1     ;
  #200  res = 0     ;
  end
      
  initial//
  begin
        clk = 0     ;
  end
  always
  begin
      #50 clk = ~clk ;
  end
      
  initial
  begin
       yout = 9'b000000000;
  end

  always@(posedge clk or posedge res)
  begin
      if(res)
          yout = 'b0      ;
      else
          yout = yout + 1 ;
  end
      
  add  
   DUT  (
       .yout (yout ) ,
      .youtput (youtput ) ,
      .res (res ) ,
      .clk (clk ) );

endmodule





0
累加.png
奖励3积分
2020-6-28 11:33:51   评论 分享淘帖 邀请回答
3个回答
本帖最后由 卿小小_9e6 于 2020-6-28 13:00 编辑

01.在“add”——Line06,应声明reg/wire,根据下方代码,我这边改为:“ output reg [8:0] youtput;”
02.在“add”——Line10~Line18,缺少对y_ou/y_out的初始赋值操作,导致其初始状态为不定值x,所以youtput输出是x。
add代码如下:
------分割线------
  1. module add(clk, res, yout, youtput);
  2.    input        clk;
  3.    input        res;
  4.    input [8:0]  yout;
  5.    output reg [8:0] youtput;
  6.    reg [8:0]    y_out;
  7.    reg [8:0]    y_ou;
  8.    
  9. //   always @(posedge res or posedge clk)
  10. //      if (res == 1'b1)
  11. //         youtput <= 9'b000000000;
  12. //      else
  13. //      begin
  14. //         y_ou       <=        yout  ;
  15. //         y_out      <= y_ou + y_out ;
  16. //         youtput    <=        y_out ;
  17. //      end
  18.    always @(posedge res or posedge clk)
  19.    begin
  20.       if (res == 1'b1)
  21.       begin
  22.          youtput <= 9'b000000000;
  23.          y_out   <=  'b0;
  24.          y_ou    <=  'b0;
  25.       end
  26.       else
  27.       begin
  28.          y_ou       <=        yout  ;
  29.          y_out      <= y_ou + y_out ;
  30.          youtput    <=        y_out ;
  31.       end
  32.    end
  33.    
  34. endmodule
复制代码

------分割线------
仿真结果如下(我的复位时间为200ns,故而仿真截图与你发的截图不太一致)
add_sim_ok.png
2020-6-28 12:53:30 3 评论

举报

3 条评论
  • 2020-6-28 12:55

    你可以先尝试只对y_ou或者y_out进行复位时的初始赋值,此时youtput仍旧为x。只有其涉及的所有运算变量均被准确赋值,youtput才能正常输出。

    区幺幺 回复 卿小小_9e6: 6 天前

    您好,请问为什么我在累加器代码里对y_ou和y_out赋初值后,y_out的值还是为不定态没能赋进去呢?并且看到y_ou的值也没能按顺序赋入

    卿小小_9e6 回复 区幺幺: 6 天前

    先说数据不对齐,且不为顺序递增数的原因:
    tb代码中,针对yout的赋值没有与时钟对齐。时钟是100ns的周期,但是你的数据源是40ns递增。
    仔细查看我截图中tb-yout值,和add-you的值变化,和你描述的情况基本一致。

本帖最后由 卿小小_9e6 于 2020-6-30 12:33 编辑

------此回复针对数据不对齐,且不为连续递增数------
tb代码中,时钟及yout赋值

  1. //  always
  2. //  begin
  3. //      #50 clk = ~clk ;
  4. //  end
  5. //----------------
  6. //  always
  7. //  begin
  8. //      #40 yout = yout + 1 ;
  9. //  end
复制代码

修正tb代码后仿真结果(数据对齐,且为递增数):
  1. `timescale 1ns / 1ps

  2. module add_tb  ;

  3.   reg           res         ;
  4.   reg           clk         ;
  5.   reg  [8:0]    yout        ;
  6.   wire [8:0]    youtput     ;
  7.   
  8.   initial//
  9.   begin
  10.         res = 1     ;
  11.   #200  res = 0     ;
  12.   end
  13.       
  14.   initial//
  15.   begin
  16.         clk = 0     ;
  17.   end
  18.   always
  19.   begin
  20.       #50 clk = ~clk ;
  21.   end
  22.       
  23.   initial
  24.   begin
  25.        yout = 9'b000000000;
  26.   end
  27.   
  28. //  always
  29. //  begin
  30. //      #40 yout = yout + 1 ;
  31. //  end
  32.   always@(posedge clk or posedge res)
  33.   begin
  34.       if(res)
  35.           yout = 'b0      ;
  36.       else
  37.           yout = yout + 1 ;
  38.   end
  39.       
  40.   add    DUT  (
  41.   .yout     (yout       ) ,
  42.   .youtput  (youtput    ) ,
  43.   .res      (res        ) ,
  44.   .clk      (clk        )
  45.    
  46.   );

  47. endmodule
复制代码



add_sim_2020-06-30_ok.png
------此回复针对初始不定态------
说实话,不晓得,只能归于仿真环境的差异导致。

add.v代码如下:

  1. module add(clk, res, yout, youtput);
  2.    input        clk;
  3.    input        res;
  4.    input [8:0]  yout;
  5.    output reg [8:0] youtput;
  6.    reg [8:0]    y_out;
  7.    reg [8:0]    y_ou;
  8.    
  9. //   always @(posedge res or posedge clk)
  10. //      if (res == 1'b1)
  11. //         youtput <= 9'b000000000;
  12. //      else
  13. //      begin
  14. //         y_ou       <=        yout  ;
  15. //         y_out      <= y_ou + y_out ;
  16. //         youtput    <=        y_out ;
  17. //      end
  18.    always @(posedge res or posedge clk)
  19.    begin
  20.       if (res == 1'b1)
  21.       begin
  22.          youtput <= 9'b000000000;
  23.          y_out   <=  'b0;
  24.          y_ou    <=  'b0;
  25.       end
  26.       else
  27.       begin
  28.          y_ou       <=        yout  ;
  29.          y_out      <= y_ou + y_out ;
  30.          youtput    <=        y_out ;
  31.       end
  32.    end
  33.    
  34. endmodule
复制代码
4 条评论

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表