【问题标题】:Unable to get output in Verilog simulation of digital clockVerilog模拟数字时钟无法获得输出
【发布时间】:2020-09-11 14:59:43
【问题描述】:

我想使用 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

【问题讨论】:

  • 不确定这是否是原因,但 generateSec 中的 s1、s2 和 min_en 应该是线而不是 reg,因为它们是由单元输出驱动的。
  • 我无法复制它。我没有得到'x',它在模拟中工作正常。这可能是波浪倾倒或竞争条件的问题。一种建议是将@(posedge clk or rst) 替换为@(posedge clk or posedge rst)

标签: verilog simulation clock xilinx-ise


【解决方案1】:

使用 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)

还应在Mod6Counter 中重置en_out

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2023-03-10
    • 2022-10-13
    相关资源
    最近更新 更多