在 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 调度程序中的竞争条件。
我正在用 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 调度程序中的竞争条件。