如何在没有initial或always块的情况下使用$display

发布于 2024-10-21 04:47:07 字数 85 浏览 2 评论 0原文

我正在尝试调试一个不使用初始或始终使用 $display 语句的 Verilog 模块。然而,这些在初始或始终块之外似乎是非法的。这是为什么?我有什么选择?

I'm trying to debug a Verilog module that doesn't use initial or always by using $display statements. However, these appear to be illegal outside of initial or always blocks. Why is that? What are my alternatives?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

℉服软 2024-10-28 04:47:07

为什么?因为 IEEE 标准就是这样指定的。

另一种方法是从测试台缩小模块实例的范围。您的测试平台将有一个 initialalways 块,它将调用 $display。另一个有用的系统任务是 $monitor:

module tb;

reg a = 0;

dut dut ( .a(a) );

initial begin
    $monitor("time=%0t, a=%b, b=%b", $time, a, dut.b);
    #5 a = 1;
    #5 a = 0;
    #5 $finish;
end

endmodule

module dut (input a);
    wire b = ~a;
endmodule

运行模拟时您应该得到这种输出:

time=0, a=0, b=1
time=5, a=1, b=0
time=10, a=0, b=1

dut.b 信号是一个分层说明符,允许您缩小范围从顶级模块 (tb) 进入另一个模块。 dut 是实例名称,b 是 dut 实例内的信号名称。实例名称与信号名称之间用句点分隔。

Why? Because that's how the IEEE standard has specified it.

An alternative is to scope down into your module instance from your testbench. Your testbench will have an initial or always block which will call $display. Another useful system task is $monitor:

module tb;

reg a = 0;

dut dut ( .a(a) );

initial begin
    $monitor("time=%0t, a=%b, b=%b", $time, a, dut.b);
    #5 a = 1;
    #5 a = 0;
    #5 $finish;
end

endmodule

module dut (input a);
    wire b = ~a;
endmodule

You should get this kind of output when you run a simulation:

time=0, a=0, b=1
time=5, a=1, b=0
time=10, a=0, b=1

The dut.b signal is a hierarchical specifier that allows you to scope down into another module from the top-level module (tb). dut is the instance name, and b is the signal name inside the dut instance. A period separates the instance name from the signal name.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文