在Verilog中显示一个公交车

时间:2016-10-15 08:09:47

标签: verilog hdl

我正在用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。可能是什么错误?

2 个答案:

答案 0 :(得分:1)

您声明了a两次,一次是4位输出(推断导线类型),一次是内部单位reg。你这样做的方式不符合IEEE标准,因为它不遵循ANSI或非ANSI风格。有些模拟器可能允许你做的和正常工作,有些模拟器会抛出编译错误(严格的IEEE兼容性),有些模糊者会感到困惑。我猜测后者是模拟器发生的事情;也许你的编译日志中有一条警告信息。

删除行reg a;并将output [3:0] a更改为output reg [3:0] a,使其与ANSI样式标题兼容。使用ANSI端口列表样式时,端口方向,类型,宽度和名称将使用相同的名称声明。

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

备选方案是非ANSI样式(不推荐),需要一行来声明端口顺序,另一行用于指示端口顺序。尺寸,以及一个可选的附加线,使其成为一个注册。下面是一个正确的非ANSI样式标题.IEEE1364-1995需要非ANSI样式标题。 ANSI已添加并成为自IEEE1364-2001以来的推荐样式,支持非ANSI,因此可继续使用遗留代码。

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

其他请注意,应为flops分配非阻止(<=)分配,而不是阻止(=)分配。至少要改变a = i;a <= i;以获得正确的编码风格,以避免verilog调度程序中的竞争条件。

答案 1 :(得分:0)

你在0时拨打“$ display”一次。你期待看到什么? 尝试将$ display更改为“$ monitor(ta,clock);”。