我正在用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 :(得分: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);”。