1 秒 ClkDivider 模拟不工作

1 Second ClkDivider Simulation Not Working

我正在尝试使用 100 MHz clk 输入创建第二个 clk 计数器,但是当我模拟 clk 分频器时,即使 clk 输入正确,它也只是将输出显示为 X。我可能做错了什么?

1秒clk分频器:

module clkdiv(
    input clk,
    input [25:0] terminalcount,
    output reg clk_div
);

reg [25:0] count;
wire tc;

assign tc = (count == terminalcount);

always @ (posedge(clk)) begin
    if (tc) count <= 0;
    else count <= count + 1;
end

always @ (posedge(clk)) begin
    if (tc) clk_div = !clk_div;
end

endmodule

测试台:

module clockdivTB;

// inputs 
reg clk; // make 100 MHz -- T = 10 ns

// outputs
wire newclk;

// second clock -- connect test signals to clkdiv
clkdiv slowclkCUT (
    .clk(clk),
    .terminalcount(50000000-1), // 1 Hz
    .clk_div(newclk)
);

// initialize inputs
initial begin 
    clk = 0;    
    
    // create input clock 100MHz
    forever #5 clk = ~clk;
end

endmodule

结果:

输出为 X,因为 reg 类型被初始化为 X(未知)。您需要将输出初始化为已知值。出于模拟目的,您可以将 clk_divcount 设置为 0,如下所示:

module clkdiv(
    input clk,
    input [25:0] terminalcount,
    output reg clk_div = 0
);

reg [25:0] count = 0;

但是,如果您想综合您的逻辑,您可能需要添加一个复位输入。您可以从测试台驱动输入。

module clkdiv(
    input reset,
    input clk,
    input [25:0] terminalcount,
    output reg clk_div
);

reg [25:0] count;
wire tc;

assign tc = (count == terminalcount);

always @ (posedge(clk)) begin
    if (reset) count <= 0;
    else if (tc) count <= 0;
    else count <= count + 1;
end

always @ (posedge(clk)) begin
    if (reset) clk_div <= 0;
    else if (tc) clk_div <= !clk_div;
end

endmodule