在 verilog 中使用显示

5 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
Run Code Online (Sandbox Code Playgroud)

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

Mor*_*gan 5

因为显示应该始终在initial块内,所以我无法将显示用于调试目的。

我不确定你从哪里得到它,它几乎和所有东西一样,但assign它必须在块内使用,intial或者always.

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

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

  assign c = a&b;

  always @*
    $display("%b",c);
endmodule
Run Code Online (Sandbox Code Playgroud)

最好从顶层显示和检查,保持模块代码干净。要display在 testench 中使用,您可以执行以下操作:

与模块内部的格式相同:

always @* begin
  $display("%b",c);
end
Run Code Online (Sandbox Code Playgroud)

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

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 
Run Code Online (Sandbox Code Playgroud)


sha*_*111 5

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
Run Code Online (Sandbox Code Playgroud)

为了在每次更改时显示,$monitor很有用。$display 可以像上面一样使用,但这会让你的代码变得混乱。请记住,您的代码中必须只有一个$monitor。$display 中没有这样的限制。

这些只是一些方法,还有许多其他方法。更多信息可以在这个这个链接中找到。