mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-24 01:25:33 +00:00
Add new builtin FF types
The new types include: - FFs with async reset and enable (`$adffe`, `$_DFFE_[NP][NP][01][NP]_`) - FFs with sync reset (`$sdff`, `$_SDFF_[NP][NP][01]_`) - FFs with sync reset and enable, reset priority (`$sdffs`, `$_SDFFE_[NP][NP][01][NP]_`) - FFs with sync reset and enable, enable priority (`$sdffce`, `$_SDFFCE_[NP][NP][01][NP]_`) - FFs with async reset, set, and enable (`$dffsre`, `$_DFFSRE_[NP][NP][NP][NP]_`) - latches with reset or set (`$adlatch`, `$_DLATCH_[NP][NP][01]_`) The new FF types are not actually used anywhere yet (this is left for future commits).
This commit is contained in:
parent
8c4cb1885b
commit
b0bee396a8
8 changed files with 2736 additions and 70 deletions
|
@ -108,6 +108,31 @@ endmodule
|
|||
"""
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
//-
|
||||
//- $_DFFE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q)
|
||||
//-
|
||||
//- A {C:negative|positive} edge D-type flip-flop with {R:negative|positive} polarity {V:reset|set} and {E:negative|positive}
|
||||
//- polarity clock enable.
|
||||
//-
|
||||
//- Truth table: D C R E | Q
|
||||
//- ---------+---
|
||||
//- - - {R:0|1} - | {V:0|1}
|
||||
//- d {C:\\|/} - {E:0|1} | d
|
||||
//- - - - - | q
|
||||
//-
|
||||
module \$_DFFE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q);
|
||||
input D, C, R, E;
|
||||
output reg Q;
|
||||
always @({C:neg|pos}edge C or {R:neg|pos}edge R) begin
|
||||
if (R == {R:0|1})
|
||||
Q <= {V:0|1};
|
||||
else if (E == {E:0|1})
|
||||
Q <= D;
|
||||
end
|
||||
endmodule
|
||||
""",
|
||||
"""
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
//-
|
||||
//- $_DFFSR_{C:N|P}{S:N|P}{R:N|P}_ (C, S, R, D, Q)
|
||||
//-
|
||||
//- A {C:negative|positive} edge D-type flip-flop with {S:negative|positive} polarity set and {R:negative|positive}
|
||||
|
@ -136,6 +161,110 @@ endmodule
|
|||
"""
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
//-
|
||||
//- $_DFFSRE_{C:N|P}{S:N|P}{R:N|P}{E:N|P}_ (C, S, R, E, D, Q)
|
||||
//-
|
||||
//- A {C:negative|positive} edge D-type flip-flop with {S:negative|positive} polarity set, {R:negative|positive}
|
||||
//- polarity reset and {E:negative|positive} polarity clock enable.
|
||||
//-
|
||||
//- Truth table: C S R E D | Q
|
||||
//- -----------+---
|
||||
//- - - {R:0|1} - - | 0
|
||||
//- - {S:0|1} - - - | 1
|
||||
//- {C:\\|/} - - {E:0|1} d | d
|
||||
//- - - - - - | q
|
||||
//-
|
||||
module \$_DFFSRE_{C:N|P}{S:N|P}{R:N|P}{E:N|P}_ (C, S, R, E, D, Q);
|
||||
input C, S, R, E, D;
|
||||
output reg Q;
|
||||
always @({C:neg|pos}edge C, {S:neg|pos}edge S, {R:neg|pos}edge R) begin
|
||||
if (R == {R:0|1})
|
||||
Q <= 0;
|
||||
else if (S == {S:0|1})
|
||||
Q <= 1;
|
||||
else if (E == {E:0|1})
|
||||
Q <= D;
|
||||
end
|
||||
endmodule
|
||||
""",
|
||||
"""
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
//-
|
||||
//- $_SDFF_{C:N|P}{R:N|P}{V:0|1}_ (D, C, R, Q)
|
||||
//-
|
||||
//- A {C:negative|positive} edge D-type flip-flop with {R:negative|positive} polarity synchronous {V:reset|set}.
|
||||
//-
|
||||
//- Truth table: D C R | Q
|
||||
//- -------+---
|
||||
//- - {C:\\|/} {R:0|1} | {V:0|1}
|
||||
//- d {C:\\|/} - | d
|
||||
//- - - - | q
|
||||
//-
|
||||
module \$_SDFF_{C:N|P}{R:N|P}{V:0|1}_ (D, C, R, Q);
|
||||
input D, C, R;
|
||||
output reg Q;
|
||||
always @({C:neg|pos}edge C) begin
|
||||
if (R == {R:0|1})
|
||||
Q <= {V:0|1};
|
||||
else
|
||||
Q <= D;
|
||||
end
|
||||
endmodule
|
||||
""",
|
||||
"""
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
//-
|
||||
//- $_SDFFE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q)
|
||||
//-
|
||||
//- A {C:negative|positive} edge D-type flip-flop with {R:negative|positive} polarity synchronous {V:reset|set} and {E:negative|positive}
|
||||
//- polarity clock enable (with {V:reset|set} having priority).
|
||||
//-
|
||||
//- Truth table: D C R E | Q
|
||||
//- ---------+---
|
||||
//- - {C:\\|/} {R:0|1} - | {V:0|1}
|
||||
//- d {C:\\|/} - {E:0|1} | d
|
||||
//- - - - - | q
|
||||
//-
|
||||
module \$_SDFFE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q);
|
||||
input D, C, R, E;
|
||||
output reg Q;
|
||||
always @({C:neg|pos}edge C) begin
|
||||
if (R == {R:0|1})
|
||||
Q <= {V:0|1};
|
||||
else if (E == {E:0|1})
|
||||
Q <= D;
|
||||
end
|
||||
endmodule
|
||||
""",
|
||||
"""
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
//-
|
||||
//- $_SDFFCE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q)
|
||||
//-
|
||||
//- A {C:negative|positive} edge D-type flip-flop with {R:negative|positive} polarity synchronous {V:reset|set} and {E:negative|positive}
|
||||
//- polarity clock enable (with clock enable having priority).
|
||||
//-
|
||||
//- Truth table: D C R E | Q
|
||||
//- ---------+---
|
||||
//- - {C:\\|/} {R:0|1} {E:0|1} | {V:0|1}
|
||||
//- d {C:\\|/} - {E:0|1} | d
|
||||
//- - - - - | q
|
||||
//-
|
||||
module \$_SDFFCE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q);
|
||||
input D, C, R, E;
|
||||
output reg Q;
|
||||
always @({C:neg|pos}edge C) begin
|
||||
if (E == {E:0|1}) begin
|
||||
if (R == {R:0|1})
|
||||
Q <= {V:0|1};
|
||||
else
|
||||
Q <= D;
|
||||
end
|
||||
end
|
||||
endmodule
|
||||
""",
|
||||
"""
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
//-
|
||||
//- $_DLATCH_{E:N|P}_ (E, D, Q)
|
||||
//-
|
||||
//- A {E:negative|positive} enable D-type latch.
|
||||
|
@ -157,6 +286,30 @@ endmodule
|
|||
"""
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
//-
|
||||
//- $_DLATCH_{E:N|P}{R:N|P}{V:0|1}_ (E, R, D, Q)
|
||||
//-
|
||||
//- A {E:negative|positive} enable D-type latch with {R:negative|positive} polarity {V:reset|set}.
|
||||
//-
|
||||
//- Truth table: E R D | Q
|
||||
//- -------+---
|
||||
//- - {R:0|1} - | {V:0|1}
|
||||
//- {E:0|1} - d | d
|
||||
//- - - - | q
|
||||
//-
|
||||
module \$_DLATCH_{E:N|P}{R:N|P}{V:0|1}_ (E, R, D, Q);
|
||||
input E, R, D;
|
||||
output reg Q;
|
||||
always @* begin
|
||||
if (R == {E:0|1})
|
||||
Q <= {V:0|1};
|
||||
else if (E == {E:0|1})
|
||||
Q <= D;
|
||||
end
|
||||
endmodule
|
||||
""",
|
||||
"""
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
//-
|
||||
//- $_DLATCHSR_{E:N|P}{S:N|P}{R:N|P}_ (E, S, R, D, Q)
|
||||
//-
|
||||
//- A {E:negative|positive} enable D-type latch with {S:negative|positive} polarity set and {R:negative|positive}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1822,6 +1822,39 @@ endgenerate
|
|||
|
||||
endmodule
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
module \$dffsre (CLK, SET, CLR, EN, D, Q);
|
||||
|
||||
parameter WIDTH = 0;
|
||||
parameter CLK_POLARITY = 1'b1;
|
||||
parameter SET_POLARITY = 1'b1;
|
||||
parameter CLR_POLARITY = 1'b1;
|
||||
parameter EN_POLARITY = 1'b1;
|
||||
|
||||
input CLK, EN;
|
||||
input [WIDTH-1:0] SET, CLR, D;
|
||||
output reg [WIDTH-1:0] Q;
|
||||
|
||||
wire pos_clk = CLK == CLK_POLARITY;
|
||||
wire [WIDTH-1:0] pos_set = SET_POLARITY ? SET : ~SET;
|
||||
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], posedge pos_clk)
|
||||
if (pos_clr[i])
|
||||
Q[i] <= 0;
|
||||
else if (pos_set[i])
|
||||
Q[i] <= 1;
|
||||
else if (EN == EN_POLARITY)
|
||||
Q[i] <= D[i];
|
||||
end
|
||||
endgenerate
|
||||
|
||||
endmodule
|
||||
|
||||
`endif
|
||||
// --------------------------------------------------------
|
||||
|
||||
|
@ -1849,6 +1882,107 @@ endmodule
|
|||
|
||||
// --------------------------------------------------------
|
||||
|
||||
module \$sdff (CLK, SRST, D, Q);
|
||||
|
||||
parameter WIDTH = 0;
|
||||
parameter CLK_POLARITY = 1'b1;
|
||||
parameter SRST_POLARITY = 1'b1;
|
||||
parameter SRST_VALUE = 0;
|
||||
|
||||
input CLK, SRST;
|
||||
input [WIDTH-1:0] D;
|
||||
output reg [WIDTH-1:0] Q;
|
||||
wire pos_clk = CLK == CLK_POLARITY;
|
||||
wire pos_srst = SRST == SRST_POLARITY;
|
||||
|
||||
always @(posedge pos_clk) begin
|
||||
if (pos_srst)
|
||||
Q <= SRST_VALUE;
|
||||
else
|
||||
Q <= D;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
module \$adffe (CLK, ARST, EN, D, Q);
|
||||
|
||||
parameter WIDTH = 0;
|
||||
parameter CLK_POLARITY = 1'b1;
|
||||
parameter EN_POLARITY = 1'b1;
|
||||
parameter ARST_POLARITY = 1'b1;
|
||||
parameter ARST_VALUE = 0;
|
||||
|
||||
input CLK, ARST, EN;
|
||||
input [WIDTH-1:0] D;
|
||||
output reg [WIDTH-1:0] Q;
|
||||
wire pos_clk = CLK == CLK_POLARITY;
|
||||
wire pos_arst = ARST == ARST_POLARITY;
|
||||
|
||||
always @(posedge pos_clk, posedge pos_arst) begin
|
||||
if (pos_arst)
|
||||
Q <= ARST_VALUE;
|
||||
else if (EN == EN_POLARITY)
|
||||
Q <= D;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
module \$sdffe (CLK, SRST, EN, D, Q);
|
||||
|
||||
parameter WIDTH = 0;
|
||||
parameter CLK_POLARITY = 1'b1;
|
||||
parameter EN_POLARITY = 1'b1;
|
||||
parameter SRST_POLARITY = 1'b1;
|
||||
parameter SRST_VALUE = 0;
|
||||
|
||||
input CLK, SRST, EN;
|
||||
input [WIDTH-1:0] D;
|
||||
output reg [WIDTH-1:0] Q;
|
||||
wire pos_clk = CLK == CLK_POLARITY;
|
||||
wire pos_srst = SRST == SRST_POLARITY;
|
||||
|
||||
always @(posedge pos_clk) begin
|
||||
if (pos_srst)
|
||||
Q <= SRST_VALUE;
|
||||
else if (EN == EN_POLARITY)
|
||||
Q <= D;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
module \$sdffce (CLK, SRST, EN, D, Q);
|
||||
|
||||
parameter WIDTH = 0;
|
||||
parameter CLK_POLARITY = 1'b1;
|
||||
parameter EN_POLARITY = 1'b1;
|
||||
parameter SRST_POLARITY = 1'b1;
|
||||
parameter SRST_VALUE = 0;
|
||||
|
||||
input CLK, SRST, EN;
|
||||
input [WIDTH-1:0] D;
|
||||
output reg [WIDTH-1:0] Q;
|
||||
wire pos_clk = CLK == CLK_POLARITY;
|
||||
wire pos_srst = SRST == SRST_POLARITY;
|
||||
|
||||
always @(posedge pos_clk) begin
|
||||
if (EN == EN_POLARITY) begin
|
||||
if (pos_srst)
|
||||
Q <= SRST_VALUE;
|
||||
else
|
||||
Q <= D;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
module \$dlatch (EN, D, Q);
|
||||
|
||||
parameter WIDTH = 0;
|
||||
|
@ -1865,6 +1999,28 @@ end
|
|||
|
||||
endmodule
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
module \$adlatch (EN, ARST, D, Q);
|
||||
|
||||
parameter WIDTH = 0;
|
||||
parameter EN_POLARITY = 1'b1;
|
||||
parameter ARST_POLARITY = 1'b1;
|
||||
parameter ARST_VALUE = 0;
|
||||
|
||||
input EN, ARST;
|
||||
input [WIDTH-1:0] D;
|
||||
output reg [WIDTH-1:0] Q;
|
||||
|
||||
always @* begin
|
||||
if (ARST == ARST_POLARITY)
|
||||
Q = ARST_VALUE;
|
||||
else if (EN == EN_POLARITY)
|
||||
Q = D;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// --------------------------------------------------------
|
||||
`ifndef SIMLIB_NOSR
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue