在 Verilog 中显示总线

Displaying a bus in Verilog

我正在用 Verilog 编写代码,它会在时钟的每个边沿计数到 15,然后返回到 0。但是,我无法显示波形。我只能看到Z(高阻抗)。

`timescale 1ns / 1ps


module Counter(
input ck,
output [3:0] a

);

reg a;

reg [3:0] i = 4'b0000;
always@(posedge ck)
begin
    a = i;

    if(i==15)
    i = 0;

    else
    i = i+1;
end

endmodule

这是驱动它的测试平台:

module Counter_tb;

wire clock;
wire [3:0] ta;

Clocker mygate(.clk(clock));

Counter mygate2(.ck(clock), .a(ta));

initial
begin
    $display(ta, clock);

end
endmodule

时钟波形显示正常,但ta不正常。可能的错误是什么?

您在时间 0 调用了一次“$display”。您希望看到什么? 尝试将 $display 更改为 "$monitor(ta, clock);".

您声明了 a 两次,一次是 4 位输出(推断的线路类型),一次是内部单位寄存器。你这样做的方式是 non-compliant 符合 IEEE 标准,因为它不遵循 ANSI 或 non-ANSI 风格。一些模拟器可能允许你所做的并正确工作,其他人会抛出编译错误(严格的 IEEE 合规性),还有一些人会感到困惑。我猜后者是您的模拟器发生的事情;也许您查看过的编译日志中有一条警告消息。

删除行reg a;并将output [3:0] a更改为输出<i><b>reg</b></i> [3:0] a 使其与 ANSI 样式兼容 header。使用 ANSI 端口列表样式,端口方向、类型、宽度和名称都在同一名称上声明。

module Counter(
input ck,
output reg [3:0] a
);

备选方案是 Non-ANSI 样式(不推荐),需要一行声明端口顺序,另一行声明方向和大小,以及可选的附加行以使其成为 reg。 IEEE1364-1995 需要适当的 Non-ANSI 风格 header below.The Non-ANSI 风格 header。添加了 ANSI 并成为自 IEEE1364-2001 以来的推荐样式,支持 non-ANSI 因此遗留代码可以继续使用。

module Counter(ck, a);
input ck;
output [3:0] a;
reg [3:0] a;

另请注意,触发器应分配 non-blocking (<=) 个分配,而不是阻塞 (=) 个分配。至少将 a = i; 更改为 a <= i; 以实践正确的编码风格,这将避免 verilog 调度程序中的竞争条件。