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 中是否有某种方法可以做到这一点?
因为显示应该始终在
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)
Verilog/SystemVerilog 包含组织良好的事件队列。每个时间戳中的所有语句都按照这个队列执行。以下是一些不同的显示系统任务。
$display在ACTIVE 区域执行,因此如果有任何非阻塞赋值(在 INACTIVE 区域执行),$display 不会显示它。这将显示单个输出行。
$write也在ACTIVE 区域中执行,但需要显式调用换行符(\n )来插入另一行。当您想要使用 for 循环显示多维数组时,通常会使用此系统任务。这与显示(\n)字符除外。
$strobe在MONITOR/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 中没有这样的限制。
这些只是一些方法,还有许多其他方法。更多信息可以在这个 和这个链接中找到。