Verilog 序列1101011的D触发器序列生成器不生成结果

Verilog 序列1101011的D触发器序列生成器不生成结果,verilog,register-transfer-level,digital-design,Verilog,Register Transfer Level,Digital Design,我在DFF模块中为DFlipFlop创建了一个模块,并在seqgen模块中实例化了其中4个模块。我无法产生结果。你能告诉我哪里出了问题吗 module DFF(input d, input rstn, input clk, output reg q); always @(posedge clk or negedge rstn) if(!rstn) q <= 0; else q <= d; end

我在
DFF
模块中为DFlipFlop创建了一个模块,并在
seqgen
模块中实例化了其中4个模块。我无法产生结果。你能告诉我哪里出了问题吗

module DFF(input d, input rstn, input clk, output reg q);

    always @(posedge clk or negedge rstn)
        if(!rstn)
            q <= 0;
        else
            q <= d;
endmodule

module seqgen();
    wire q1=1'b1,q2=1'b1,q3=1'b1,q4=1'b0;
    wire da=1'b1;
    reg clk = 1'b0,rstn  = 1;
    always #10 clk = ~clk;
    assign da = ~q1|~q2|~q4;
    DFF dffa(da,rstn,clk,q1);
    DFF dffb(q1,rstn,clk,q2);
    DFF dffc(q2,rstn,clk,q3);
    DFF dffd(q3,rstn,clk,q4);
endmodule
模块DFF(输入d、输入rstn、输入clk、输出reg q);
始终@(posedge clk或negedge rstn)
如果(!rstn)

有两种类型的问题

由于连续的
wire
分配,您的
DFF
模块的输出由
DFF
模块内部和
seqgen
模块内部驱动。您不应将值分配给
导线
。这会导致争用,这是输出上未知值(
x
)的来源之一。在
da
的情况下,您有2个连续作业,但您应该只有1个

另外,您应该在时间0断言重置,等待延迟,然后取消重置。这是另一个未知的来源。由于它是一个有效的低复位,将其设置为0,然后在延迟后,将其设置为1

这段代码为我消除了未知信号

module seqgen();
    wire q1,q2,q3,q4;
    wire da;
    reg clk = 1'b0, rstn = 0;
    initial #25 rstn=1;
    always #10 clk = ~clk;
    assign da = ~q1|~q2|~q4;
    DFF dffa(da,rstn,clk,q1);
    DFF dffb(q1,rstn,clk,q2);
    DFF dffc(q2,rstn,clk,q3);
    DFF dffd(q3,rstn,clk,q4);
endmodule