Fix the truth table for $_SR_* cells.
authorMarcelina Kościelnicka <mwk@0x04.net>
Sat, 11 Apr 2020 14:03:19 +0000 (16:03 +0200)
committerMarcelina Kościelnicka <mwk@0x04.net>
Wed, 15 Apr 2020 15:17:48 +0000 (17:17 +0200)
This brings the documented behavior for these cells in line with
$_DFFSR_* and $_DLATCHSR_*, which is that R has priority over S.
The models were already reflecting that behavior.

Also get rid of sim-synth mismatch in the models while we're at it.

techlibs/common/gen_fine_ffs.py
techlibs/common/simcells.v
techlibs/common/simlib.v

index 3a9aa6c59480e997ed8c820d16b9195ff8c228f0..0abe48f61f7597f2ae08f624397f5f00485a5868 100644 (file)
@@ -8,15 +8,14 @@ TEMPLATES = [
 //-
 //- Truth table:    S R | Q
 //-                -----+---
-//-                 {S:0|1} {R:0|1} | x
-//-                 {S:0|1} {R:1|0} | 1
-//-                 {S:1|0} {R:0|1} | 0
-//-                 {S:1|0} {R:1|0} | y
+//-                 - {R:0|1} | 0
+//-                 {S:0|1} - | 1
+//-                 - - | q
 //-
 module \$_SR_{S:N|P}{R:N|P}_ (S, R, Q);
 input S, R;
 output reg Q;
-always @({S:neg|pos}edge S, {R:neg|pos}edge R) begin
+always @* begin
        if (R == {R:0|1})
                Q <= 0;
        else if (S == {S:0|1})
index 2bac78d38c376920bffc7bc8d8870a083b5f31fa..157e8d23b20afb4cadc856a1fae312d7f22e13d1 100644 (file)
@@ -469,15 +469,14 @@ endmodule
 //-
 //- Truth table:    S R | Q
 //-                -----+---
-//-                 0 0 | x
-//-                 0 1 | 1
-//-                 1 0 | 0
-//-                 1 1 | y
+//-                 - 0 | 0
+//-                 0 - | 1
+//-                 - - | q
 //-
 module \$_SR_NN_ (S, R, Q);
 input S, R;
 output reg Q;
-always @(negedge S, negedge R) begin
+always @* begin
        if (R == 0)
                Q <= 0;
        else if (S == 0)
@@ -493,15 +492,14 @@ endmodule
 //-
 //- Truth table:    S R | Q
 //-                -----+---
-//-                 0 1 | x
-//-                 0 0 | 1
-//-                 1 1 | 0
-//-                 1 0 | y
+//-                 - 1 | 0
+//-                 0 - | 1
+//-                 - - | q
 //-
 module \$_SR_NP_ (S, R, Q);
 input S, R;
 output reg Q;
-always @(negedge S, posedge R) begin
+always @* begin
        if (R == 1)
                Q <= 0;
        else if (S == 0)
@@ -517,15 +515,14 @@ endmodule
 //-
 //- Truth table:    S R | Q
 //-                -----+---
-//-                 1 0 | x
-//-                 1 1 | 1
-//-                 0 0 | 0
-//-                 0 1 | y
+//-                 - 0 | 0
+//-                 1 - | 1
+//-                 - - | q
 //-
 module \$_SR_PN_ (S, R, Q);
 input S, R;
 output reg Q;
-always @(posedge S, negedge R) begin
+always @* begin
        if (R == 0)
                Q <= 0;
        else if (S == 1)
@@ -541,15 +538,14 @@ endmodule
 //-
 //- Truth table:    S R | Q
 //-                -----+---
-//-                 1 1 | x
-//-                 1 0 | 1
-//-                 0 1 | 0
-//-                 0 0 | y
+//-                 - 1 | 0
+//-                 1 - | 1
+//-                 - - | q
 //-
 module \$_SR_PP_ (S, R, Q);
 input S, R;
 output reg Q;
-always @(posedge S, posedge R) begin
+always @* begin
        if (R == 1)
                Q <= 0;
        else if (S == 1)
index 7845a3fed144c861bcbf6f35ddee25d47ef7a1fd..2cdddeabb840247b2072265bd86c6c6425fb49f2 100644 (file)
@@ -1633,7 +1633,7 @@ wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR;
 genvar i;
 generate
        for (i = 0; i < WIDTH; i = i+1) begin:bitslices
-               always @(posedge pos_set[i], posedge pos_clr[i])
+               always @*
                        if (pos_clr[i])
                                Q[i] <= 0;
                        else if (pos_set[i])