无法在数字时钟的Verilog仿真中获得输出

问题描述 投票:3回答:1

我想设计一个秒计数器,使用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

generateSec的测试平台如下:

`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

我将上述问题的输出屏幕截图粘贴到这里。Output of Verilog simulation of generateSec-testbench

verilog simulation clock xilinx-ise
1个回答
0
投票

使用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仅支持Verilog2001。Xilinx的Vivado可以。

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

也应该在en_out中重设Mod6Counter

© www.soinside.com 2019 - 2024. All rights reserved.