在 verilog 中使用显示

Using display in verilog

我是 verilog 的新手,我知道它不是一种顺序语言。所以,我想问有没有什么方法可以在执行后在模块中显示结果?因为显示应该总是在 initial 块内,所以我无法使用显示进行调试。这是一个示例代码,可以更好地解释我的问题-

module A(a,b,c);
    input a,b;
    output c;

    assign c=a&b;

    initial
      $display("%b",c);
endmodule

module testbench11;
   reg a,b;
   wire c;

   A a1(a,b,c);

   initial
      $monitor(,$time,"a=%b,b=%b,c=%b",a,b,c);

   initial
      begin
         #0 a=1'b0;b=1'b0;         
         #3 a=1'b0;b=1'b0; 
         #3 a=1'b0;b=1'b0; 
      end
endmodule

所以我想在每个时间实例之后显示 c 的结果,以检查我是否获得了所需的输出。在这种情况下,它似乎在最后显示结果,但在一些复杂的问题中,我想使用 display 进行调试,就像我在 C 中使用 printf 一样。有没有办法做到这一点verilog?

Because display should always be inside initial block and so there is no way I can use display for debugging purposes.

我不确定你是从哪里得到这个的,它几乎与除 assign 之外的所有东西都一样,因为它必须在块内使用,intialalways

要使用它在模块内部进行调试:

module A(a,b,c);
  input  a,b;
  output c;

  assign c = a&b;

  always @*
    $display("%b",c);
endmodule

最好从顶层展示和检查,保持模块代码干净。要在测试中使用 display,您可以这样做:

与模块内部相同的格式:

always @* begin
  $display("%b",c);
end

或者知道你在每个刺激步骤后显示:

initial begin
  #0 a=1'b0;b=1'b0;         
  #1 $display("%b",c);

  #3 a=1'b0;b=1'b0; 
  #1 $display("%b",c);

  #3 a=1'b0;b=1'b0; 
  #1 $display("%b",c);
end 

Verilog/SystemVerilog 包含组织良好的事件队列。每个时间戳中的所有语句都根据这个队列执行。以下是一些不同的显示系统任务。

  • $displayACTIVE 区域 中执行,所以如果有任何非阻塞赋值(在INACTIVE 区域),它不会被 $display 显示。这将显示单个输出行。

  • $write 也在 ACTIVE 区域 中执行,但是显式调用换行符(\n) 需要插入另一行。这个系统任务一般用在用for循环显示多维数组的时候。这类似于显示除了 (\n) 字符。

  • $strobeMONITOR/POSTPONED区域执行,即时间戳结束.因此,更新后的值显示为 $strobe.

  • $monitor 每次其显示参数之一发生变化时显示。每个模拟只能使用一个 $monitor。监视器,顾名思义,持续监视信号并在任何信号值发生变化时执行。

对于您的代码,要在各个点显示,可以完成以下代码更改。

    initial
    #5 $display("%b",c);  // display after some arbitrary time.

    initial
    begin
    repeat(5)
    begin 
     wait(c);
     $display("%b",c);  // display after   change in c 5 times.
    end
    end

    initial
    begin
    forever
    begin 
     #1;
     $display("%b",c);  // display c at every timestamp
    end
    end

    always @(c)
    $display("%b",c);  // display after any change in c

    always @(a,b,c)
    $display("%b",c);  // display after any change in a or b or c

为了在每次更改时显示,$monitor 很有用。 $display 可以像上面那样使用,但这会使您的代码混乱。请记住,您的代码中必须只有 one $monitor。 $display.

没有这样的限制

这些只是其中的一些方法,还有许多其他方法可用。如需更多信息,请访问 thisthis 个链接。