我对verilog世界很陌生,我无法理解为什么我的程序什么都不返回。我试图制作一个简单的6位向上计数器,按下按钮。代码是
module top (CLK, BTN_RST, LED, BTN_C);
input CLK, BTN_RST, BTN_C; //
output [5:0]LED;
reg [5:0]LED;
always @(posedge CLK or posedge BTN_RST) begin
if (BTN_RST) begin
LED <= 6'b000000;
end
else begin: COUNT
while (BTN_C) begin
LED <= LED + 1'b1;
disable COUNT;
end
end
end
endmodule
测试台是
module top_test;
reg CLK;
reg BTN_RST;
reg BTN_C;
reg [5:0]LED;
initial begin
CLK = 0;
BTN_RST = 0;
BTN_C = 0;
#1 BTN_RST = 1;
#5 BTN_RST = 0;
#10 BTN_C = 1;
#50;
end
always
begin
#5 CLK=~CLK;
end
此代码编译并运行(我可以在iSim上看到),但LED输出给了我XXXXXX。我认为我不仅在这里遇到了一些错误,而且还无法理解测试平台的工作原理以及如何在输入和输出上做出正确的分配。有人可以帮帮我吗?
答案 0 :(得分:3)
您需要在测试平台中添加设计实例。现在,LED不再是X;我看到它从0开始计数。
module top_test;
reg CLK;
reg BTN_RST;
reg BTN_C;
wire [5:0]LED;
initial begin
CLK = 0;
BTN_RST = 0;
BTN_C = 0;
#1 BTN_RST = 1;
#5 BTN_RST = 0;
#10 BTN_C = 1;
#50;
end
always
begin
#5 CLK=~CLK;
end
top dut (
// Inputs:
.BTN_C (BTN_C),
.BTN_RST (BTN_RST),
.CLK (CLK),
// Outputs:
.LED (LED)
);
endmodule
更新:我在top_test中将reg更改为连线LED。当我使用VCS作为模拟器时,我看到LED从0增加。但是,当我切换到Incisive时,LED保持在0。
我认为您的while / disable代码导致了问题。我把它重新编码看起来更标准:
module top (CLK, BTN_RST, LED, BTN_C);
input CLK, BTN_RST, BTN_C; //
output [5:0]LED;
reg [5:0]LED;
always @(posedge CLK or posedge BTN_RST) begin
if (BTN_RST) begin
LED <= 6'b000000;
end else if (BTN_C) begin
LED <= LED + 1'b1;
end
end
endmodule