verilog中的4位sr锁存器

verilog中的4位sr锁存器,verilog,hdl,iverilog,Verilog,Hdl,Iverilog,我正在为4位sr锁存器编写verilog代码。我认为闩锁是异步的。因此,我没有包括时钟。首先我为1位sr锁存器编写了代码,然后我将该代码用于4位sr锁存器 module srlatch (S, R, En, Q, Qc); input S, R; input En; output Q, Qc; reg Q,Qc; always@(*) begin if(En) begin Q = ~(R | Qc)

我正在为4位sr锁存器编写verilog代码。我认为闩锁是异步的。因此,我没有包括时钟。首先我为1位sr锁存器编写了代码,然后我将该代码用于4位sr锁存器

 module srlatch (S, R, En, Q, Qc);
    input S, R;
    input En;
    output Q, Qc;
    reg Q,Qc;
  always@(*)
    begin
      if(En)
        begin
          Q  =  ~(R | Qc); 
          Qc =  ~(S | Q); 
        end
    end

endmodule



module srlatch4 (S, R, En, Q, Qc);
    input [3:0] S, R;
    input En;
    output [3:0] Q, Qc;


  srlatch s1(S[0], R[0], En, Q[0], Qc[0]);
  srlatch s2(S[1], R[1], En, Q[1], Qc[1]);
  srlatch s3(S[2], R[2], En, Q[2], Qc[2]);
  srlatch s4(S[3], R[3], En, Q[3], Qc[3]);


endmodule
有什么问题?它没有通过测试用例,即 Q(t)=0x0x,Qc(t)=1010和S=1100,R=0000,En=0,Q(t+1)=0x0x,Qc(t+1)=1010

由于使用了always@(En),只有在En信号值发生变化时才会执行程序块语句

您可以按照下面的方式进行编码

module srlatch ( input S,
                 input R,
                 input En,
                 output reg Q,
                 output reg Qc);

always @(*) begin
  if (En) begin
    Q  =  ~(R | Qc); 
    Qc =  ~(S | Q); 
  end
end

endmodule : srlatch

此外,代码中的S-R闩锁实现的表达式也不正确

在srlatch4模块中实例化srlatch时,出现错误“模块实例化无效”?您可能对模块实例化之前的代码有问题。不要忘记在模块实例化之后加分号(;)。@Kerul Modi您能指出我代码中的问题吗?我已经根据你的建议修改了代码。但它并没有通过所有的测试用例?@Kerul Modi你能检查一下并告诉我这个问题吗?