使用$ monitor在verilog中进行模拟

时间:2014-10-10 04:47:22

标签: simulation verilog

我一直在尝试在Verilog中实现全加法器。我已经实现了它,它也在Isim上显示结果。唯一的问题是,当我尝试使用$ monitor命令查看模拟时,它只显示1个结果,而不是所有模拟结果。这是testbench代码:

module Full_adder_s2_testbench;

// Inputs
reg a;
reg b;
reg cin;

// Outputs
wire sum;
wire cout;

// Instantiate the Unit Under Test (UUT)
Full_adder_s2 uut (
    .a(a), 
    .b(b), 
    .cin(cin), 
    .sum(sum), 
    .cout(cout)
);
integer i;

initial begin
    // Initialize Inputs
    a = 0;
    b = 0;
    cin = 0;

    // Wait 100 ns for global reset to finish
    #100;

    end
    always @ ( a, b, cin )
            begin

            // generate truth table
            for ( i = 0; i < 8; i = i + 1 )
                    // every 10 ns set a, b, and cin to the binary rep. of i
                    #10 {a, b, cin} = i;
                    $monitor( "%d ns: a + b + cin = %b + %b + %b = cout sum = %b %b",
                                             $time, a, b, cin, cout, sum );  
            // stop 10ns after last change of inputs
            #10 $stop;
            end


endmodule

这是ISIM的结果:

运行1000 ns

模拟器正在进行电路初始化过程。

完成电路初始化过程。

             400 ns: a + b + cin = 1 + 1 + 1 = cout sum = 1 1

时间停止:410 ns:在文件“E:/ Namal / FYP /我的工作/ XILINX / Full_adder_s2 / Full_adder_s2_testbench.v”第66行

1 个答案:

答案 0 :(得分:2)

$monitor只需设置一次,每次信号发生变化时都会触发,请尝试使用$display,因为您已经在always @*内有声明。

在学习Verilog时,我鼓励你自由地使用begin end。问题是for循环只有1行,$display / $monitor在外面,因此只在开始时执行一次。

always @* begin
  // generate truth table
  for ( i = 0; i < 8; i = i + 1 ) begin //<-- Added begin
    // every 10 ns set a, b, and cin to the binary rep. of i
    #10 {a, b, cin} = i;
    $display( "%d ns: a + b + cin = %b + %b + %b = cout sum = %b %b", $time, a, b, cin, cout, sum ); 
  end //<--Added end
  // stop 10ns after last input
  #10 $stop;

EDA Playground上的完整示例。

注意:最好不再使用手动敏感度列表,将always @ ( a, b, cin )替换为always @*。这将导致更快的重构并降低RTL与门模拟不匹配的可能性。