reg qb;不能由原语或连续赋值驱动

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

我正在尝试在 Icarus Verilog 上制作 SR 触发器。

触发器模块:

module srff(sr,clk,q,qb);
    input [1:0]sr;
    input clk;
    output reg q,qb;

    always@(posedge clk) begin
        case(sr)
        2'b00: q=q;
        2'b01: q=0;
        2'b10: q=1;
        2'b11: q=1'bz;
    endcase
    end
    assign qb=~q;
endmodule   

测试台:

module sr_ff_test;
    reg [1:0]sr;
    reg clk;
    wire q,qbar;

    srff sr_ff_test(sr,clk,q,qbar);

    initial begin $dumpfile("dump1.vcd");
    $dumpvars(0,sr_ff_test);
    end

    initial begin
    $monitor("S=%d, R=%d, CLK=%d, Q=%d, Qbar=%d",sr[0],sr[1],clk,q,qbar);

    sr[0]=1'b0;
    sr[1]=1'b1;
    clk=1;
 
    #100
    sr[0]=1'b0;
    sr[1]=1'b1;
     
    #100
    sr[0]=1'b0;
    sr[1]=1'b0;
     
    #100
    sr[0]=1'b1;
    sr[1]=1'b1;
     
    #100
    sr[0]=1'b0;
    sr[1]=1'b1;
     
    #100    
    sr[0]=1'b0;
    sr[1]=1'b1;
    end
endmodule

错误如问题中给出(测试平台第 14 行 - 带监视器的行...)。出了什么问题,我该如何解决这个问题?

我是 Icarus Verilog 的新手,不知道是否不小心使用了无法使用的命令。

verilog hdl iverilog
1个回答
1
投票

错误出现在

srff
模块中。 您将
qb
声明为
reg
,但随后尝试使用
assign
关键字通过连续赋值来驱动它。

解决方案是不要将其声明为

reg
。 变化:

    output reg q,qb;

至:

    output reg q;
    output qb;
© www.soinside.com 2019 - 2024. All rights reserved.