在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 978|回复: 4

[求助] iVerilog和VCS的仿真结果不一致?

[复制链接]
发表于 2023-8-13 09:54:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
大家好,我最近在测试一个设计,发现iverilog和vcs仿真结果不一致的问题。
vcs的对 <= 的处理有问题, 请大伙看看,这是一个真的问题吗?
举一个简单的例子,使用一个小设计adder:
Verilog code:




  1. module top(input wire clk, input wire [27:0] io_in, output wire [27:0] io_out, io_oeb);
  2.         wire rst = io_in[0];
  3.         reg [15:0] ctr;

  4.         always @(posedge clk)
  5.                 if (rst)
  6.                         ctr <= 0;
  7.                 else
  8.                         ctr <= ctr + 1'b1;

  9.         assign io_out = {10'h123, ctr, rst, 1'b0}; // pass thru reset for debugging
  10.         assign io_oeb = 28'b1;
  11. endmodule


复制代码
testbench in iverilog:




  1. `timescale 1ps/1ps
  2. module fab_tb;
  3.     wire [27:0] I_top;
  4.     wire [27:0] T_top;
  5.     reg [27:0] O_top = 0;

  6.     reg CLK = 1'b0;


  7.     wire [27:0] I_top_gold, oeb_gold, T_top_gold;
  8.     top dut_i (
  9.         .clk(CLK),
  10.         .io_out(I_top_gold),
  11.         .io_oeb(oeb_gold),
  12.         .io_in(O_top)
  13.     );

  14.     assign T_top_gold = ~oeb_gold;


  15.     always #50 CLK = (CLK === 1'b0);

  16.     integer i;
  17.     reg have_errors = 1'b0;
  18.     initial begin

  19.         repeat (100) @(posedge CLK);
  20.         O_top = 28'b1; // reset
  21.         repeat (5) @(posedge CLK);
  22.         O_top = 28'b0;

  23.         for (i = 0; i < 100; i = i + 1) begin
  24.             @(negedge CLK);
  25.             $display("cnt  = 0x%X, f gold = 0x%X,  gold = 0x%X", O_top, I_top_gold, T_top_gold);
  26.         end

  27.         if (have_errors)
  28.             $fatal;
  29.         else
  30.             $finish;
  31.     end
  32.    
  33.     initial begin
  34.             $dumpfile("wave.vcd");        //
  35.             $dumpvars(0, fab_tb);
  36.    
  37.     end

  38. endmodule

  39. module clk_buf(input A, output X);
  40. assign X = A;
  41. endmodule



复制代码
testbench in vcs:





  1. module adder_tb;
  2.     wire [27:0] I_top;
  3.     wire [27:0] T_top;

  4.     reg [27:0] O_top = 0;
  5.     reg CLK  = 1'b1;

  6.     wire [27:0] I_top_gold, oeb_gold, T_top_gold;
  7.     top dut_i (
  8.         .clk(CLK),
  9.         .io_out(I_top_gold),
  10.         .io_oeb(oeb_gold),
  11.         .io_in(O_top)
  12.     );

  13.     assign T_top_gold = ~oeb_gold;


  14.     always #50 CLK = (CLK === 1'b0);

  15.     //always begin
  16.         //#50
  17.         //CLK = ~CLK;
  18.     //end
  19.     //always #50 CLK = ~CLK ;


  20.     integer i;
  21.     reg have_errors = 1'b0;
  22.     initial begin

  23.         repeat (100) @(posedge CLK);
  24.         O_top = 28'b1; // reset
  25.         repeat (5) @(posedge CLK);

  26.         O_top = 28'b0;
  27.         //repeat (50) @(posedge CLK);
  28.         //$display("in_in = 0x%X, gold = 0x%X, gold = 0x%X", O_top, I_top_gold, T_top_gold);
  29.         for (i = 0; i < 100; i = i + 1) begin
  30.             @(negedge CLK);
  31.             $display("in_in = 0x%X, gold = 0x%X, gold = 0x%X", CLK, I_top_gold, T_top_gold);
  32.         end

  33.         if (have_errors)
  34.             $fatal;
  35.         else
  36.             $finish;
  37.     end
  38.         initial begin
  39.                 $fsdbDumpfile("adder_tb.fsdb");  //
  40.                 $fsdbDumpvars(0,adder_tb);       //     
  41.                 //$fsdbDumpSVA();
  42.                 //$fsdbDumpMDA();  
  43.                 //$vcdpluson;
  44.                 //$vcdplusmemon;
  45.         end

  46. endmodule

  47. module clk_buf(input A, output X);
  48. assign X = A;
  49. endmodule




复制代码
iverilog_GtkWave结果(我认为是正确的):

VCS+Verdi:

iverilog+GtkWave

iverilog+GtkWave

VCS+Verdi

VCS+Verdi
发表于 2023-8-14 09:53:11 | 显示全部楼层
always @(posedge clk or posedge rst)  ,这样子试一下
 楼主| 发表于 2023-8-14 12:27:41 | 显示全部楼层


JustdoitAbel 发表于 2023-8-14 09:53
always @(posedge clk or posedge rst)  ,这样子试一下


谢谢大佬,但是刚刚试了下,还是同样的结果
发表于 2023-8-15 07:17:42 | 显示全部楼层
#0 O_top = 28'b0;
試試
 楼主| 发表于 2023-8-15 23:38:36 | 显示全部楼层


jasper0608 发表于 2023-8-15 07:17
#0 O_top = 28'b0;
試試


真的可以!谢谢大佬
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-26 04:30 , Processed in 0.017782 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表