Verilog 具有四个与非门的时钟SR锁存器的输出是意外的

Verilog 具有四个与非门的时钟SR锁存器的输出是意外的,verilog,Verilog,这是我的密码: `timescale 1ns/1ns module sr_latch (input s,r,clk ,output q,q_bar,w,w_bar); wire i,j; assign w=q; assign w_bar=q_bar; nand#7(i , r , clk); nand#7(j , s , clk); nand#7(q_bar,q,i); nand#7(q , q_bar , j); endmodule m

这是我的密码:

`timescale 1ns/1ns
module sr_latch (input s,r,clk ,output q,q_bar,w,w_bar);
    wire i,j;
    assign w=q;
    assign w_bar=q_bar;
    nand#7(i , r , clk);
    nand#7(j , s , clk);
    nand#7(q_bar,q,i);
    nand#7(q , q_bar , j);
endmodule

module tb_sr_latch();
    reg s,r,clk;
    wire q,q_bar,w,w_bar;
    sr_latch op( s , r , clk , q , q_bar ,w,w_bar);
    initial begin 
        clk=1; s=0 ; r=1; 
        #50 r=0;
        #50 s=1;
        #50 r=1;
    end
endmodule

我不知道为什么
s=1
r=1
的输出是1。如果我使用另一个测试台(例如在开始时添加
q=0
),它会产生很多“X”值。

我不相信R=S=1是(选通)SR锁存器的有效输入。在这种状态下,任何输出都将无效。SR闩锁的真值表:


另请参见:

s
r
输入均为1时,
q
q\u条
输出均为1,因为
nand
门是如何建模的。参考IEEE标准1800-2017第28.4节和,nand、nor、or、xor和xnor门。如果到与非门的两个输入均为1,则输出为0。如果任一输入为0,则输出为1

我添加了实例名称以澄清我的解释:

nand #7 n1 (i , r , clk);
nand #7 n2 (j , s , clk);
nand #7 n3 (q_bar , q , i);
nand #7 n4 (q , q_bar , j);
由于clk=1,当r=1时,
n1
nand
门强制i=0

类似地,当s=1时,
n2
与非门强制j=0

当i=0时,
n3
与非门将
q\u条
强制为1,与
q
无关

类似地,当j=0时,
n4
nand
门强制
q
为1,而不考虑
q\u条


如果这不是您想要的行为,那么您需要更改您的Verilog代码以获得您想要的任何东西;您没有描述在这种情况下需要什么。

我知道这不是有效的输入,但我的verilog代码没有显示这一点!我不知道为什么。它无效的原因是输出无效。这并不意味着输出将产生一个未知的(X),但是输出不能也不应该被使用,因为结果是不可预测的。这并不能解释为什么Verilog模拟将输出设置为1。