无法在数字时钟的 Verilog 模拟中获取输出



我想设计一个秒计数器,它使用Mod10COUNTER和Mod6Counter从0到59。我正在尝试使用测试平台测试输出。生成的时钟是完美的。但是,输出始终为"X"。这是秒计数器的代码。

module generateSec(clk, reset, s1, s2, min_en);
input wire clk, reset;
output reg [3:0] s1, s2;
output reg min_en;
wire enable;
Mod10Counter sec1 (.clk(clk), .out(s1), .en_out(enable), .rst(reset));
Mod6Counter sec2 (.clk(enable), .out(s2), .en_out(min_en), .rst(reset));
endmodule

我已经编写了如下使用的模块。

module Mod10Counter(clk, out, en_out, rst);
input clk, rst;
output reg [3:0] out;
output reg en_out;
always @(posedge clk or rst) begin
if (rst) begin
out<=4'b0000;
en_out<=1'b0;
end
else if (out == 4'b1001) begin
out <= 4'b0000;
en_out <= 1'b1;
end      
else begin
out <= out+1;
en_out <= 1'b0;
end
end
endmodule
module Mod6Counter(clk, out, en_out, rst);
input clk, rst;
output reg [3:0] out;
output reg en_out;
always @(posedge clk or rst) begin
if (rst) out<=4'b0000;
else if (out == 4'b0101) begin
out <= 4'b0000;
en_out <= 1'b1;
end     
else begin
out <= out+1;
en_out <= 1'b0;
end
end 
endmodule

生成秒的测试台如下:

`timescale 1ms / 1ps
module generateSec_test;
// Inputs
reg clk;
reg reset;
// Outputs
wire [3:0] s1;
wire [3:0] s2;
wire min_en;
// Instantiate the Unit Under Test (UUT)
generateSec uut (
.clk(clk), 
.reset(reset), 
.s1(s1), 
.s2(s2), 
.min_en(min_en)
);
initial begin
clk = 0;
forever #500 clk=~clk;
end
initial begin
reset = 1;
#550;
reset =0;
end 
endmodule

我在这里粘贴输出的屏幕截图以解决上述问题。 生成秒测试平台的Verilog模拟输出

使用 Verilog,模块端口无法驱动reg。SystemVerilog确实允许这样做。

为了留在Verilog,在generateSec,更改:

output reg [3:0] s1, s2;
output reg min_en;

自:

output [3:0] s1, s2;
output min_en;

或者,如果您的工具集支持 SystemVerilog,则可以将文件扩展名从.v更改为.sv,并且可以将其保留为output reg(首选outputoutput logic(。据我所知,Xilinx 的 ISE 仅支持 Verilog 2001。Xilinx 的 Vivado 做到了。

正如Serge所说,@(posedge clk or rst)应该@(posedge clk or posedge rst)

此外,en_out应该在Mod6Counter中重置。

最新更新