在 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
之外的所有东西都一样,因为它必须在块内使用,intial
或 always
。
要使用它在模块内部进行调试:
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 包含组织良好的事件队列。每个时间戳中的所有语句都根据这个队列执行。以下是一些不同的显示系统任务。
$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
为了在每次更改时显示,$monitor 很有用。 $display 可以像上面那样使用,但这会使您的代码混乱。请记住,您的代码中必须只有 one $monitor。 $display.
没有这样的限制
我是 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
之外的所有东西都一样,因为它必须在块内使用,intial
或 always
。
要使用它在模块内部进行调试:
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 包含组织良好的事件队列。每个时间戳中的所有语句都根据这个队列执行。以下是一些不同的显示系统任务。
$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
为了在每次更改时显示,$monitor 很有用。 $display 可以像上面那样使用,但这会使您的代码混乱。请记住,您的代码中必须只有 one $monitor。 $display.
没有这样的限制