mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-13 12:28:44 +00:00
Docs: Split gate-level cells into subpages
This commit is contained in:
parent
b0bc29e215
commit
5473b60aec
53
docs/source/cell/gate_comb_combined.rst
Normal file
53
docs/source/cell/gate_comb_combined.rst
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
.. role:: verilog(code)
|
||||||
|
:language: Verilog
|
||||||
|
|
||||||
|
Combinatorial cells (combined)
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
These cells combine two or more combinatorial cells (simple) into a single cell.
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level combinatorial cells (combined)
|
||||||
|
|
||||||
|
======================================= =============
|
||||||
|
Verilog Cell Type
|
||||||
|
======================================= =============
|
||||||
|
:verilog:`Y = A & ~B` `$_ANDNOT_`
|
||||||
|
:verilog:`Y = A | ~B` `$_ORNOT_`
|
||||||
|
:verilog:`Y = ~((A & B) | C)` `$_AOI3_`
|
||||||
|
:verilog:`Y = ~((A | B) & C)` `$_OAI3_`
|
||||||
|
:verilog:`Y = ~((A & B) | (C & D))` `$_AOI4_`
|
||||||
|
:verilog:`Y = ~((A | B) & (C | D))` `$_OAI4_`
|
||||||
|
:verilog:`Y = ~(S ? B : A)` `$_NMUX_`
|
||||||
|
(see below) `$_MUX4_`
|
||||||
|
(see below) `$_MUX8_`
|
||||||
|
(see below) `$_MUX16_`
|
||||||
|
======================================= =============
|
||||||
|
|
||||||
|
The `$_MUX4_`, `$_MUX8_` and `$_MUX16_` cells are used to model wide muxes, and
|
||||||
|
correspond to the following Verilog code:
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
// $_MUX4_
|
||||||
|
assign Y = T ? (S ? D : C) :
|
||||||
|
(S ? B : A);
|
||||||
|
// $_MUX8_
|
||||||
|
assign Y = U ? T ? (S ? H : G) :
|
||||||
|
(S ? F : E) :
|
||||||
|
T ? (S ? D : C) :
|
||||||
|
(S ? B : A);
|
||||||
|
// $_MUX16_
|
||||||
|
assign Y = V ? U ? T ? (S ? P : O) :
|
||||||
|
(S ? N : M) :
|
||||||
|
T ? (S ? L : K) :
|
||||||
|
(S ? J : I) :
|
||||||
|
U ? T ? (S ? H : G) :
|
||||||
|
(S ? F : E) :
|
||||||
|
T ? (S ? D : C) :
|
||||||
|
(S ? B : A);
|
||||||
|
|
||||||
|
.. autocellgroup:: comb_combined
|
||||||
|
:members:
|
||||||
|
:source:
|
||||||
|
:linenos:
|
26
docs/source/cell/gate_comb_simple.rst
Normal file
26
docs/source/cell/gate_comb_simple.rst
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
.. role:: verilog(code)
|
||||||
|
:language: Verilog
|
||||||
|
|
||||||
|
Combinatorial cells (simple)
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level combinatorial cells (simple)
|
||||||
|
|
||||||
|
======================================= =============
|
||||||
|
Verilog Cell Type
|
||||||
|
======================================= =============
|
||||||
|
:verilog:`Y = A` `$_BUF_`
|
||||||
|
:verilog:`Y = ~A` `$_NOT_`
|
||||||
|
:verilog:`Y = A & B` `$_AND_`
|
||||||
|
:verilog:`Y = ~(A & B)` `$_NAND_`
|
||||||
|
:verilog:`Y = A | B` `$_OR_`
|
||||||
|
:verilog:`Y = ~(A | B)` `$_NOR_`
|
||||||
|
:verilog:`Y = A ^ B` `$_XOR_`
|
||||||
|
:verilog:`Y = ~(A ^ B)` `$_XNOR_`
|
||||||
|
:verilog:`Y = S ? B : A` `$_MUX_`
|
||||||
|
======================================= =============
|
||||||
|
|
||||||
|
.. autocellgroup:: comb_simple
|
||||||
|
:members:
|
||||||
|
:source:
|
||||||
|
:linenos:
|
|
@ -1,5 +0,0 @@
|
||||||
.. autocellgroup:: gate_other
|
|
||||||
:caption: Other gate-level cells
|
|
||||||
:members:
|
|
||||||
:source:
|
|
||||||
:linenos:
|
|
231
docs/source/cell/gate_reg_ff.rst
Normal file
231
docs/source/cell/gate_reg_ff.rst
Normal file
|
@ -0,0 +1,231 @@
|
||||||
|
.. role:: verilog(code)
|
||||||
|
:language: Verilog
|
||||||
|
|
||||||
|
Flip-flop cells
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The cell types `$_DFF_N_` and `$_DFF_P_` represent d-type flip-flops.
|
||||||
|
|
||||||
|
.. table:: Cell types for basic flip-flops
|
||||||
|
|
||||||
|
======================================= =============
|
||||||
|
Verilog Cell Type
|
||||||
|
======================================= =============
|
||||||
|
:verilog:`always @(negedge C) Q <= D` `$_DFF_N_`
|
||||||
|
:verilog:`always @(posedge C) Q <= D` `$_DFF_P_`
|
||||||
|
======================================= =============
|
||||||
|
|
||||||
|
The cell types ``$_DFFE_[NP][NP]_`` implement d-type flip-flops with enable. The
|
||||||
|
values in the table for these cell types relate to the following Verilog code
|
||||||
|
template.
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @(CLK_EDGE C)
|
||||||
|
if (EN == EN_LVL)
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level logic networks (FFs with enable)
|
||||||
|
:name: tab:CellLib_gates_dffe
|
||||||
|
|
||||||
|
================== ============= ============
|
||||||
|
:math:`ClkEdge` :math:`EnLvl` Cell Type
|
||||||
|
================== ============= ============
|
||||||
|
:verilog:`negedge` ``0`` `$_DFFE_NN_`
|
||||||
|
:verilog:`negedge` ``1`` `$_DFFE_NP_`
|
||||||
|
:verilog:`posedge` ``0`` `$_DFFE_PN_`
|
||||||
|
:verilog:`posedge` ``1`` `$_DFFE_PP_`
|
||||||
|
================== ============= ============
|
||||||
|
|
||||||
|
The cell types ``$_DFF_[NP][NP][01]_`` implement d-type flip-flops with
|
||||||
|
asynchronous reset. The values in the table for these cell types relate to the
|
||||||
|
following Verilog code template, where ``RST_EDGE`` is ``posedge`` if
|
||||||
|
``RST_LVL`` if ``1``, and ``negedge`` otherwise.
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @(CLK_EDGE C, RST_EDGE R)
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= RST_VAL;
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
The cell types ``$_SDFF_[NP][NP][01]_`` implement d-type flip-flops with
|
||||||
|
synchronous reset. The values in the table for these cell types relate to the
|
||||||
|
following Verilog code template:
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @(CLK_EDGE C)
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= RST_VAL;
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level logic networks (FFs with reset)
|
||||||
|
:name: tab:CellLib_gates_adff
|
||||||
|
|
||||||
|
================== ============== ============== ===========================
|
||||||
|
:math:`ClkEdge` :math:`RstLvl` :math:`RstVal` Cell Type
|
||||||
|
================== ============== ============== ===========================
|
||||||
|
:verilog:`negedge` ``0`` ``0`` `$_DFF_NN0_`, `$_SDFF_NN0_`
|
||||||
|
:verilog:`negedge` ``0`` ``1`` `$_DFF_NN1_`, `$_SDFF_NN1_`
|
||||||
|
:verilog:`negedge` ``1`` ``0`` `$_DFF_NP0_`, `$_SDFF_NP0_`
|
||||||
|
:verilog:`negedge` ``1`` ``1`` `$_DFF_NP1_`, `$_SDFF_NP1_`
|
||||||
|
:verilog:`posedge` ``0`` ``0`` `$_DFF_PN0_`, `$_SDFF_PN0_`
|
||||||
|
:verilog:`posedge` ``0`` ``1`` `$_DFF_PN1_`, `$_SDFF_PN1_`
|
||||||
|
:verilog:`posedge` ``1`` ``0`` `$_DFF_PP0_`, `$_SDFF_PP0_`
|
||||||
|
:verilog:`posedge` ``1`` ``1`` `$_DFF_PP1_`, `$_SDFF_PP1_`
|
||||||
|
================== ============== ============== ===========================
|
||||||
|
|
||||||
|
The cell types ``$_DFFE_[NP][NP][01][NP]_`` implement d-type flip-flops with
|
||||||
|
asynchronous reset and enable. The values in the table for these cell types
|
||||||
|
relate to the following Verilog code template, where ``RST_EDGE`` is ``posedge``
|
||||||
|
if ``RST_LVL`` if ``1``, and ``negedge`` otherwise.
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @(CLK_EDGE C, RST_EDGE R)
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= RST_VAL;
|
||||||
|
else if (EN == EN_LVL)
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
The cell types ``$_SDFFE_[NP][NP][01][NP]_`` implement d-type flip-flops with
|
||||||
|
synchronous reset and enable, with reset having priority over enable. The values
|
||||||
|
in the table for these cell types relate to the following Verilog code template:
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @(CLK_EDGE C)
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= RST_VAL;
|
||||||
|
else if (EN == EN_LVL)
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
The cell types ``$_SDFFCE_[NP][NP][01][NP]_`` implement d-type flip-flops with
|
||||||
|
synchronous reset and enable, with enable having priority over reset. The values
|
||||||
|
in the table for these cell types relate to the following Verilog code template:
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @(CLK_EDGE C)
|
||||||
|
if (EN == EN_LVL)
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= RST_VAL;
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level logic networks (FFs with reset and enable)
|
||||||
|
:name: tab:CellLib_gates_adffe
|
||||||
|
|
||||||
|
================== ============== ============== ============= =================================================
|
||||||
|
:math:`ClkEdge` :math:`RstLvl` :math:`RstVal` :math:`EnLvl` Cell Type
|
||||||
|
================== ============== ============== ============= =================================================
|
||||||
|
:verilog:`negedge` ``0`` ``0`` ``0`` `$_DFFE_NN0N_`, `$_SDFFE_NN0N_`, `$_SDFFCE_NN0N_`
|
||||||
|
:verilog:`negedge` ``0`` ``0`` ``1`` `$_DFFE_NN0P_`, `$_SDFFE_NN0P_`, `$_SDFFCE_NN0P_`
|
||||||
|
:verilog:`negedge` ``0`` ``1`` ``0`` `$_DFFE_NN1N_`, `$_SDFFE_NN1N_`, `$_SDFFCE_NN1N_`
|
||||||
|
:verilog:`negedge` ``0`` ``1`` ``1`` `$_DFFE_NN1P_`, `$_SDFFE_NN1P_`, `$_SDFFCE_NN1P_`
|
||||||
|
:verilog:`negedge` ``1`` ``0`` ``0`` `$_DFFE_NP0N_`, `$_SDFFE_NP0N_`, `$_SDFFCE_NP0N_`
|
||||||
|
:verilog:`negedge` ``1`` ``0`` ``1`` `$_DFFE_NP0P_`, `$_SDFFE_NP0P_`, `$_SDFFCE_NP0P_`
|
||||||
|
:verilog:`negedge` ``1`` ``1`` ``0`` `$_DFFE_NP1N_`, `$_SDFFE_NP1N_`, `$_SDFFCE_NP1N_`
|
||||||
|
:verilog:`negedge` ``1`` ``1`` ``1`` `$_DFFE_NP1P_`, `$_SDFFE_NP1P_`, `$_SDFFCE_NP1P_`
|
||||||
|
:verilog:`posedge` ``0`` ``0`` ``0`` `$_DFFE_PN0N_`, `$_SDFFE_PN0N_`, `$_SDFFCE_PN0N_`
|
||||||
|
:verilog:`posedge` ``0`` ``0`` ``1`` `$_DFFE_PN0P_`, `$_SDFFE_PN0P_`, `$_SDFFCE_PN0P_`
|
||||||
|
:verilog:`posedge` ``0`` ``1`` ``0`` `$_DFFE_PN1N_`, `$_SDFFE_PN1N_`, `$_SDFFCE_PN1N_`
|
||||||
|
:verilog:`posedge` ``0`` ``1`` ``1`` `$_DFFE_PN1P_`, `$_SDFFE_PN1P_`, `$_SDFFCE_PN1P_`
|
||||||
|
:verilog:`posedge` ``1`` ``0`` ``0`` `$_DFFE_PP0N_`, `$_SDFFE_PP0N_`, `$_SDFFCE_PP0N_`
|
||||||
|
:verilog:`posedge` ``1`` ``0`` ``1`` `$_DFFE_PP0P_`, `$_SDFFE_PP0P_`, `$_SDFFCE_PP0P_`
|
||||||
|
:verilog:`posedge` ``1`` ``1`` ``0`` `$_DFFE_PP1N_`, `$_SDFFE_PP1N_`, `$_SDFFCE_PP1N_`
|
||||||
|
:verilog:`posedge` ``1`` ``1`` ``1`` `$_DFFE_PP1P_`, `$_SDFFE_PP1P_`, `$_SDFFCE_PP1P_`
|
||||||
|
================== ============== ============== ============= =================================================
|
||||||
|
|
||||||
|
The cell types ``$_DFFSR_[NP][NP][NP]_`` implement d-type flip-flops with
|
||||||
|
asynchronous set and reset. The values in the table for these cell types relate
|
||||||
|
to the following Verilog code template, where ``RST_EDGE`` is ``posedge`` if
|
||||||
|
``RST_LVL`` if ``1``, ``negedge`` otherwise, and ``SET_EDGE`` is ``posedge`` if
|
||||||
|
``SET_LVL`` if ``1``, ``negedge`` otherwise.
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @(CLK_EDGE C, RST_EDGE R, SET_EDGE S)
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= 0;
|
||||||
|
else if (S == SET_LVL)
|
||||||
|
Q <= 1;
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level logic networks (FFs with set and reset)
|
||||||
|
:name: tab:CellLib_gates_dffsr
|
||||||
|
|
||||||
|
================== ============== ============== ==============
|
||||||
|
:math:`ClkEdge` :math:`SetLvl` :math:`RstLvl` Cell Type
|
||||||
|
================== ============== ============== ==============
|
||||||
|
:verilog:`negedge` ``0`` ``0`` `$_DFFSR_NNN_`
|
||||||
|
:verilog:`negedge` ``0`` ``1`` `$_DFFSR_NNP_`
|
||||||
|
:verilog:`negedge` ``1`` ``0`` `$_DFFSR_NPN_`
|
||||||
|
:verilog:`negedge` ``1`` ``1`` `$_DFFSR_NPP_`
|
||||||
|
:verilog:`posedge` ``0`` ``0`` `$_DFFSR_PNN_`
|
||||||
|
:verilog:`posedge` ``0`` ``1`` `$_DFFSR_PNP_`
|
||||||
|
:verilog:`posedge` ``1`` ``0`` `$_DFFSR_PPN_`
|
||||||
|
:verilog:`posedge` ``1`` ``1`` `$_DFFSR_PPP_`
|
||||||
|
================== ============== ============== ==============
|
||||||
|
|
||||||
|
The cell types ``$_DFFSRE_[NP][NP][NP][NP]_`` implement d-type flip-flops with
|
||||||
|
asynchronous set and reset and enable. The values in the table for these cell
|
||||||
|
types relate to the following Verilog code template, where ``RST_EDGE`` is
|
||||||
|
``posedge`` if ``RST_LVL`` if ``1``, ``negedge`` otherwise, and ``SET_EDGE`` is
|
||||||
|
``posedge`` if ``SET_LVL`` if ``1``, ``negedge`` otherwise.
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @(CLK_EDGE C, RST_EDGE R, SET_EDGE S)
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= 0;
|
||||||
|
else if (S == SET_LVL)
|
||||||
|
Q <= 1;
|
||||||
|
else if (E == EN_LVL)
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level logic networks (FFs with set and reset and enable)
|
||||||
|
:name: tab:CellLib_gates_dffsre
|
||||||
|
|
||||||
|
================== ============== ============== ============= ================
|
||||||
|
:math:`ClkEdge` :math:`SetLvl` :math:`RstLvl` :math:`EnLvl` Cell Type
|
||||||
|
================== ============== ============== ============= ================
|
||||||
|
:verilog:`negedge` ``0`` ``0`` ``0`` `$_DFFSRE_NNNN_`
|
||||||
|
:verilog:`negedge` ``0`` ``0`` ``1`` `$_DFFSRE_NNNP_`
|
||||||
|
:verilog:`negedge` ``0`` ``1`` ``0`` `$_DFFSRE_NNPN_`
|
||||||
|
:verilog:`negedge` ``0`` ``1`` ``1`` `$_DFFSRE_NNPP_`
|
||||||
|
:verilog:`negedge` ``1`` ``0`` ``0`` `$_DFFSRE_NPNN_`
|
||||||
|
:verilog:`negedge` ``1`` ``0`` ``1`` `$_DFFSRE_NPNP_`
|
||||||
|
:verilog:`negedge` ``1`` ``1`` ``0`` `$_DFFSRE_NPPN_`
|
||||||
|
:verilog:`negedge` ``1`` ``1`` ``1`` `$_DFFSRE_NPPP_`
|
||||||
|
:verilog:`posedge` ``0`` ``0`` ``0`` `$_DFFSRE_PNNN_`
|
||||||
|
:verilog:`posedge` ``0`` ``0`` ``1`` `$_DFFSRE_PNNP_`
|
||||||
|
:verilog:`posedge` ``0`` ``1`` ``0`` `$_DFFSRE_PNPN_`
|
||||||
|
:verilog:`posedge` ``0`` ``1`` ``1`` `$_DFFSRE_PNPP_`
|
||||||
|
:verilog:`posedge` ``1`` ``0`` ``0`` `$_DFFSRE_PPNN_`
|
||||||
|
:verilog:`posedge` ``1`` ``0`` ``1`` `$_DFFSRE_PPNP_`
|
||||||
|
:verilog:`posedge` ``1`` ``1`` ``0`` `$_DFFSRE_PPPN_`
|
||||||
|
:verilog:`posedge` ``1`` ``1`` ``1`` `$_DFFSRE_PPPP_`
|
||||||
|
================== ============== ============== ============= ================
|
||||||
|
|
||||||
|
.. todo:: flip-flops with async load, ``$_ALDFFE?_[NP]{2,3}_``
|
||||||
|
|
||||||
|
.. autocellgroup:: reg_ff
|
||||||
|
:members:
|
||||||
|
:source:
|
||||||
|
:linenos:
|
105
docs/source/cell/gate_reg_latch.rst
Normal file
105
docs/source/cell/gate_reg_latch.rst
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
.. role:: verilog(code)
|
||||||
|
:language: Verilog
|
||||||
|
|
||||||
|
Latch cells
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The cell types `$_DLATCH_N_` and `$_DLATCH_P_` represent d-type latches.
|
||||||
|
|
||||||
|
.. table:: Cell types for basic latches
|
||||||
|
|
||||||
|
======================================= =============
|
||||||
|
Verilog Cell Type
|
||||||
|
======================================= =============
|
||||||
|
:verilog:`always @* if (!E) Q <= D` `$_DLATCH_N_`
|
||||||
|
:verilog:`always @* if (E) Q <= D` `$_DLATCH_P_`
|
||||||
|
======================================= =============
|
||||||
|
|
||||||
|
The cell types ``$_DLATCH_[NP][NP][01]_`` implement d-type latches with reset.
|
||||||
|
The values in the table for these cell types relate to the following Verilog
|
||||||
|
code template:
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @*
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= RST_VAL;
|
||||||
|
else if (E == EN_LVL)
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level logic networks (latches with reset)
|
||||||
|
:name: tab:CellLib_gates_adlatch
|
||||||
|
|
||||||
|
============= ============== ============== ===============
|
||||||
|
:math:`EnLvl` :math:`RstLvl` :math:`RstVal` Cell Type
|
||||||
|
============= ============== ============== ===============
|
||||||
|
``0`` ``0`` ``0`` `$_DLATCH_NN0_`
|
||||||
|
``0`` ``0`` ``1`` `$_DLATCH_NN1_`
|
||||||
|
``0`` ``1`` ``0`` `$_DLATCH_NP0_`
|
||||||
|
``0`` ``1`` ``1`` `$_DLATCH_NP1_`
|
||||||
|
``1`` ``0`` ``0`` `$_DLATCH_PN0_`
|
||||||
|
``1`` ``0`` ``1`` `$_DLATCH_PN1_`
|
||||||
|
``1`` ``1`` ``0`` `$_DLATCH_PP0_`
|
||||||
|
``1`` ``1`` ``1`` `$_DLATCH_PP1_`
|
||||||
|
============= ============== ============== ===============
|
||||||
|
|
||||||
|
The cell types ``$_DLATCHSR_[NP][NP][NP]_`` implement d-type latches with set
|
||||||
|
and reset. The values in the table for these cell types relate to the following
|
||||||
|
Verilog code template:
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @*
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= 0;
|
||||||
|
else if (S == SET_LVL)
|
||||||
|
Q <= 1;
|
||||||
|
else if (E == EN_LVL)
|
||||||
|
Q <= D;
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level logic networks (latches with set and reset)
|
||||||
|
:name: tab:CellLib_gates_dlatchsr
|
||||||
|
|
||||||
|
============= ============== ============== =================
|
||||||
|
:math:`EnLvl` :math:`SetLvl` :math:`RstLvl` Cell Type
|
||||||
|
============= ============== ============== =================
|
||||||
|
``0`` ``0`` ``0`` `$_DLATCHSR_NNN_`
|
||||||
|
``0`` ``0`` ``1`` `$_DLATCHSR_NNP_`
|
||||||
|
``0`` ``1`` ``0`` `$_DLATCHSR_NPN_`
|
||||||
|
``0`` ``1`` ``1`` `$_DLATCHSR_NPP_`
|
||||||
|
``1`` ``0`` ``0`` `$_DLATCHSR_PNN_`
|
||||||
|
``1`` ``0`` ``1`` `$_DLATCHSR_PNP_`
|
||||||
|
``1`` ``1`` ``0`` `$_DLATCHSR_PPN_`
|
||||||
|
``1`` ``1`` ``1`` `$_DLATCHSR_PPP_`
|
||||||
|
============= ============== ============== =================
|
||||||
|
|
||||||
|
The cell types ``$_SR_[NP][NP]_`` implement sr-type latches. The values in the
|
||||||
|
table for these cell types relate to the following Verilog code template:
|
||||||
|
|
||||||
|
.. code-block:: verilog
|
||||||
|
:force:
|
||||||
|
|
||||||
|
always @*
|
||||||
|
if (R == RST_LVL)
|
||||||
|
Q <= 0;
|
||||||
|
else if (S == SET_LVL)
|
||||||
|
Q <= 1;
|
||||||
|
|
||||||
|
.. table:: Cell types for gate level logic networks (SR latches)
|
||||||
|
:name: tab:CellLib_gates_sr
|
||||||
|
|
||||||
|
============== ============== ==========
|
||||||
|
:math:`SetLvl` :math:`RstLvl` Cell Type
|
||||||
|
============== ============== ==========
|
||||||
|
``0`` ``0`` `$_SR_NN_`
|
||||||
|
``0`` ``1`` `$_SR_NP_`
|
||||||
|
``1`` ``0`` `$_SR_PN_`
|
||||||
|
``1`` ``1`` `$_SR_PP_`
|
||||||
|
============== ============== ==========
|
||||||
|
|
||||||
|
.. autocellgroup:: reg_latch
|
||||||
|
:members:
|
||||||
|
:source:
|
||||||
|
:linenos:
|
|
@ -1,388 +1,13 @@
|
||||||
.. role:: verilog(code)
|
|
||||||
:language: Verilog
|
|
||||||
|
|
||||||
.. _sec:celllib_gates:
|
.. _sec:celllib_gates:
|
||||||
|
|
||||||
Gate-level cells
|
Gate-level cells
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
.. todo:: Split gate-level cells into subpages
|
|
||||||
|
|
||||||
Consider also checking wording to be less academic and consistent.
|
|
||||||
|
|
||||||
For gate level logic networks, fixed function single bit cells are used that do
|
For gate level logic networks, fixed function single bit cells are used that do
|
||||||
not provide any parameters.
|
not provide any parameters.
|
||||||
|
|
||||||
Simulation models for these cells can be found in the file
|
Simulation models for these cells can be found in the file
|
||||||
techlibs/common/simcells.v in the Yosys source tree.
|
:file:`techlibs/common/simcells.v` in the Yosys source tree.
|
||||||
|
|
||||||
.. table:: Cell types for gate level logic networks (main list)
|
|
||||||
:name: tab:CellLib_gates
|
|
||||||
|
|
||||||
======================================= =============
|
|
||||||
Verilog Cell Type
|
|
||||||
======================================= =============
|
|
||||||
:verilog:`Y = A` `$_BUF_`
|
|
||||||
:verilog:`Y = ~A` `$_NOT_`
|
|
||||||
:verilog:`Y = A & B` `$_AND_`
|
|
||||||
:verilog:`Y = ~(A & B)` `$_NAND_`
|
|
||||||
:verilog:`Y = A & ~B` `$_ANDNOT_`
|
|
||||||
:verilog:`Y = A | B` `$_OR_`
|
|
||||||
:verilog:`Y = ~(A | B)` `$_NOR_`
|
|
||||||
:verilog:`Y = A | ~B` `$_ORNOT_`
|
|
||||||
:verilog:`Y = A ^ B` `$_XOR_`
|
|
||||||
:verilog:`Y = ~(A ^ B)` `$_XNOR_`
|
|
||||||
:verilog:`Y = ~((A & B) | C)` `$_AOI3_`
|
|
||||||
:verilog:`Y = ~((A | B) & C)` `$_OAI3_`
|
|
||||||
:verilog:`Y = ~((A & B) | (C & D))` `$_AOI4_`
|
|
||||||
:verilog:`Y = ~((A | B) & (C | D))` `$_OAI4_`
|
|
||||||
:verilog:`Y = S ? B : A` `$_MUX_`
|
|
||||||
:verilog:`Y = ~(S ? B : A)` `$_NMUX_`
|
|
||||||
(see below) `$_MUX4_`
|
|
||||||
(see below) `$_MUX8_`
|
|
||||||
(see below) `$_MUX16_`
|
|
||||||
:verilog:`Y = EN ? A : 1'bz` `$_TBUF_`
|
|
||||||
:verilog:`always @(negedge C) Q <= D` `$_DFF_N_`
|
|
||||||
:verilog:`always @(posedge C) Q <= D` `$_DFF_P_`
|
|
||||||
:verilog:`always @* if (!E) Q <= D` `$_DLATCH_N_`
|
|
||||||
:verilog:`always @* if (E) Q <= D` `$_DLATCH_P_`
|
|
||||||
======================================= =============
|
|
||||||
|
|
||||||
.. table:: Cell types for gate level logic networks (FFs with reset)
|
|
||||||
:name: tab:CellLib_gates_adff
|
|
||||||
|
|
||||||
================== ============== ============== ===========================
|
|
||||||
:math:`ClkEdge` :math:`RstLvl` :math:`RstVal` Cell Type
|
|
||||||
================== ============== ============== ===========================
|
|
||||||
:verilog:`negedge` ``0`` ``0`` `$_DFF_NN0_`, `$_SDFF_NN0_`
|
|
||||||
:verilog:`negedge` ``0`` ``1`` `$_DFF_NN1_`, `$_SDFF_NN1_`
|
|
||||||
:verilog:`negedge` ``1`` ``0`` `$_DFF_NP0_`, `$_SDFF_NP0_`
|
|
||||||
:verilog:`negedge` ``1`` ``1`` `$_DFF_NP1_`, `$_SDFF_NP1_`
|
|
||||||
:verilog:`posedge` ``0`` ``0`` `$_DFF_PN0_`, `$_SDFF_PN0_`
|
|
||||||
:verilog:`posedge` ``0`` ``1`` `$_DFF_PN1_`, `$_SDFF_PN1_`
|
|
||||||
:verilog:`posedge` ``1`` ``0`` `$_DFF_PP0_`, `$_SDFF_PP0_`
|
|
||||||
:verilog:`posedge` ``1`` ``1`` `$_DFF_PP1_`, `$_SDFF_PP1_`
|
|
||||||
================== ============== ============== ===========================
|
|
||||||
|
|
||||||
|
|
||||||
.. table:: Cell types for gate level logic networks (FFs with enable)
|
|
||||||
:name: tab:CellLib_gates_dffe
|
|
||||||
|
|
||||||
================== ============= ============
|
|
||||||
:math:`ClkEdge` :math:`EnLvl` Cell Type
|
|
||||||
================== ============= ============
|
|
||||||
:verilog:`negedge` ``0`` `$_DFFE_NN_`
|
|
||||||
:verilog:`negedge` ``1`` `$_DFFE_NP_`
|
|
||||||
:verilog:`posedge` ``0`` `$_DFFE_PN_`
|
|
||||||
:verilog:`posedge` ``1`` `$_DFFE_PP_`
|
|
||||||
================== ============= ============
|
|
||||||
|
|
||||||
|
|
||||||
.. table:: Cell types for gate level logic networks (FFs with reset and enable)
|
|
||||||
:name: tab:CellLib_gates_adffe
|
|
||||||
|
|
||||||
================== ============== ============== ============= =================================================
|
|
||||||
:math:`ClkEdge` :math:`RstLvl` :math:`RstVal` :math:`EnLvl` Cell Type
|
|
||||||
================== ============== ============== ============= =================================================
|
|
||||||
:verilog:`negedge` ``0`` ``0`` ``0`` `$_DFFE_NN0N_`, `$_SDFFE_NN0N_`, `$_SDFFCE_NN0N_`
|
|
||||||
:verilog:`negedge` ``0`` ``0`` ``1`` `$_DFFE_NN0P_`, `$_SDFFE_NN0P_`, `$_SDFFCE_NN0P_`
|
|
||||||
:verilog:`negedge` ``0`` ``1`` ``0`` `$_DFFE_NN1N_`, `$_SDFFE_NN1N_`, `$_SDFFCE_NN1N_`
|
|
||||||
:verilog:`negedge` ``0`` ``1`` ``1`` `$_DFFE_NN1P_`, `$_SDFFE_NN1P_`, `$_SDFFCE_NN1P_`
|
|
||||||
:verilog:`negedge` ``1`` ``0`` ``0`` `$_DFFE_NP0N_`, `$_SDFFE_NP0N_`, `$_SDFFCE_NP0N_`
|
|
||||||
:verilog:`negedge` ``1`` ``0`` ``1`` `$_DFFE_NP0P_`, `$_SDFFE_NP0P_`, `$_SDFFCE_NP0P_`
|
|
||||||
:verilog:`negedge` ``1`` ``1`` ``0`` `$_DFFE_NP1N_`, `$_SDFFE_NP1N_`, `$_SDFFCE_NP1N_`
|
|
||||||
:verilog:`negedge` ``1`` ``1`` ``1`` `$_DFFE_NP1P_`, `$_SDFFE_NP1P_`, `$_SDFFCE_NP1P_`
|
|
||||||
:verilog:`posedge` ``0`` ``0`` ``0`` `$_DFFE_PN0N_`, `$_SDFFE_PN0N_`, `$_SDFFCE_PN0N_`
|
|
||||||
:verilog:`posedge` ``0`` ``0`` ``1`` `$_DFFE_PN0P_`, `$_SDFFE_PN0P_`, `$_SDFFCE_PN0P_`
|
|
||||||
:verilog:`posedge` ``0`` ``1`` ``0`` `$_DFFE_PN1N_`, `$_SDFFE_PN1N_`, `$_SDFFCE_PN1N_`
|
|
||||||
:verilog:`posedge` ``0`` ``1`` ``1`` `$_DFFE_PN1P_`, `$_SDFFE_PN1P_`, `$_SDFFCE_PN1P_`
|
|
||||||
:verilog:`posedge` ``1`` ``0`` ``0`` `$_DFFE_PP0N_`, `$_SDFFE_PP0N_`, `$_SDFFCE_PP0N_`
|
|
||||||
:verilog:`posedge` ``1`` ``0`` ``1`` `$_DFFE_PP0P_`, `$_SDFFE_PP0P_`, `$_SDFFCE_PP0P_`
|
|
||||||
:verilog:`posedge` ``1`` ``1`` ``0`` `$_DFFE_PP1N_`, `$_SDFFE_PP1N_`, `$_SDFFCE_PP1N_`
|
|
||||||
:verilog:`posedge` ``1`` ``1`` ``1`` `$_DFFE_PP1P_`, `$_SDFFE_PP1P_`, `$_SDFFCE_PP1P_`
|
|
||||||
================== ============== ============== ============= =================================================
|
|
||||||
|
|
||||||
.. table:: Cell types for gate level logic networks (FFs with set and reset)
|
|
||||||
:name: tab:CellLib_gates_dffsr
|
|
||||||
|
|
||||||
================== ============== ============== ==============
|
|
||||||
:math:`ClkEdge` :math:`SetLvl` :math:`RstLvl` Cell Type
|
|
||||||
================== ============== ============== ==============
|
|
||||||
:verilog:`negedge` ``0`` ``0`` `$_DFFSR_NNN_`
|
|
||||||
:verilog:`negedge` ``0`` ``1`` `$_DFFSR_NNP_`
|
|
||||||
:verilog:`negedge` ``1`` ``0`` `$_DFFSR_NPN_`
|
|
||||||
:verilog:`negedge` ``1`` ``1`` `$_DFFSR_NPP_`
|
|
||||||
:verilog:`posedge` ``0`` ``0`` `$_DFFSR_PNN_`
|
|
||||||
:verilog:`posedge` ``0`` ``1`` `$_DFFSR_PNP_`
|
|
||||||
:verilog:`posedge` ``1`` ``0`` `$_DFFSR_PPN_`
|
|
||||||
:verilog:`posedge` ``1`` ``1`` `$_DFFSR_PPP_`
|
|
||||||
================== ============== ============== ==============
|
|
||||||
|
|
||||||
|
|
||||||
.. table:: Cell types for gate level logic networks (FFs with set and reset and enable)
|
|
||||||
:name: tab:CellLib_gates_dffsre
|
|
||||||
|
|
||||||
================== ============== ============== ============= ================
|
|
||||||
:math:`ClkEdge` :math:`SetLvl` :math:`RstLvl` :math:`EnLvl` Cell Type
|
|
||||||
================== ============== ============== ============= ================
|
|
||||||
:verilog:`negedge` ``0`` ``0`` ``0`` `$_DFFSRE_NNNN_`
|
|
||||||
:verilog:`negedge` ``0`` ``0`` ``1`` `$_DFFSRE_NNNP_`
|
|
||||||
:verilog:`negedge` ``0`` ``1`` ``0`` `$_DFFSRE_NNPN_`
|
|
||||||
:verilog:`negedge` ``0`` ``1`` ``1`` `$_DFFSRE_NNPP_`
|
|
||||||
:verilog:`negedge` ``1`` ``0`` ``0`` `$_DFFSRE_NPNN_`
|
|
||||||
:verilog:`negedge` ``1`` ``0`` ``1`` `$_DFFSRE_NPNP_`
|
|
||||||
:verilog:`negedge` ``1`` ``1`` ``0`` `$_DFFSRE_NPPN_`
|
|
||||||
:verilog:`negedge` ``1`` ``1`` ``1`` `$_DFFSRE_NPPP_`
|
|
||||||
:verilog:`posedge` ``0`` ``0`` ``0`` `$_DFFSRE_PNNN_`
|
|
||||||
:verilog:`posedge` ``0`` ``0`` ``1`` `$_DFFSRE_PNNP_`
|
|
||||||
:verilog:`posedge` ``0`` ``1`` ``0`` `$_DFFSRE_PNPN_`
|
|
||||||
:verilog:`posedge` ``0`` ``1`` ``1`` `$_DFFSRE_PNPP_`
|
|
||||||
:verilog:`posedge` ``1`` ``0`` ``0`` `$_DFFSRE_PPNN_`
|
|
||||||
:verilog:`posedge` ``1`` ``0`` ``1`` `$_DFFSRE_PPNP_`
|
|
||||||
:verilog:`posedge` ``1`` ``1`` ``0`` `$_DFFSRE_PPPN_`
|
|
||||||
:verilog:`posedge` ``1`` ``1`` ``1`` `$_DFFSRE_PPPP_`
|
|
||||||
================== ============== ============== ============= ================
|
|
||||||
|
|
||||||
|
|
||||||
.. table:: Cell types for gate level logic networks (latches with reset)
|
|
||||||
:name: tab:CellLib_gates_adlatch
|
|
||||||
|
|
||||||
============= ============== ============== ===============
|
|
||||||
:math:`EnLvl` :math:`RstLvl` :math:`RstVal` Cell Type
|
|
||||||
============= ============== ============== ===============
|
|
||||||
``0`` ``0`` ``0`` `$_DLATCH_NN0_`
|
|
||||||
``0`` ``0`` ``1`` `$_DLATCH_NN1_`
|
|
||||||
``0`` ``1`` ``0`` `$_DLATCH_NP0_`
|
|
||||||
``0`` ``1`` ``1`` `$_DLATCH_NP1_`
|
|
||||||
``1`` ``0`` ``0`` `$_DLATCH_PN0_`
|
|
||||||
``1`` ``0`` ``1`` `$_DLATCH_PN1_`
|
|
||||||
``1`` ``1`` ``0`` `$_DLATCH_PP0_`
|
|
||||||
``1`` ``1`` ``1`` `$_DLATCH_PP1_`
|
|
||||||
============= ============== ============== ===============
|
|
||||||
|
|
||||||
|
|
||||||
.. table:: Cell types for gate level logic networks (latches with set and reset)
|
|
||||||
:name: tab:CellLib_gates_dlatchsr
|
|
||||||
|
|
||||||
============= ============== ============== =================
|
|
||||||
:math:`EnLvl` :math:`SetLvl` :math:`RstLvl` Cell Type
|
|
||||||
============= ============== ============== =================
|
|
||||||
``0`` ``0`` ``0`` `$_DLATCHSR_NNN_`
|
|
||||||
``0`` ``0`` ``1`` `$_DLATCHSR_NNP_`
|
|
||||||
``0`` ``1`` ``0`` `$_DLATCHSR_NPN_`
|
|
||||||
``0`` ``1`` ``1`` `$_DLATCHSR_NPP_`
|
|
||||||
``1`` ``0`` ``0`` `$_DLATCHSR_PNN_`
|
|
||||||
``1`` ``0`` ``1`` `$_DLATCHSR_PNP_`
|
|
||||||
``1`` ``1`` ``0`` `$_DLATCHSR_PPN_`
|
|
||||||
``1`` ``1`` ``1`` `$_DLATCHSR_PPP_`
|
|
||||||
============= ============== ============== =================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. table:: Cell types for gate level logic networks (SR latches)
|
|
||||||
:name: tab:CellLib_gates_sr
|
|
||||||
|
|
||||||
============== ============== ==========
|
|
||||||
:math:`SetLvl` :math:`RstLvl` Cell Type
|
|
||||||
============== ============== ==========
|
|
||||||
``0`` ``0`` `$_SR_NN_`
|
|
||||||
``0`` ``1`` `$_SR_NP_`
|
|
||||||
``1`` ``0`` `$_SR_PN_`
|
|
||||||
``1`` ``1`` `$_SR_PP_`
|
|
||||||
============== ============== ==========
|
|
||||||
|
|
||||||
|
|
||||||
Tables :numref:`%s <tab:CellLib_gates>`, :numref:`%s <tab:CellLib_gates_dffe>`,
|
|
||||||
:numref:`%s <tab:CellLib_gates_adff>`, :numref:`%s <tab:CellLib_gates_adffe>`,
|
|
||||||
:numref:`%s <tab:CellLib_gates_dffsr>`, :numref:`%s <tab:CellLib_gates_dffsre>`,
|
|
||||||
:numref:`%s <tab:CellLib_gates_adlatch>`, :numref:`%s
|
|
||||||
<tab:CellLib_gates_dlatchsr>` and :numref:`%s <tab:CellLib_gates_sr>` list all
|
|
||||||
cell types used for gate level logic. The cell types `$_BUF_`, `$_NOT_`,
|
|
||||||
`$_AND_`, `$_NAND_`, `$_ANDNOT_`, `$_OR_`, `$_NOR_`, `$_ORNOT_`, `$_XOR_`,
|
|
||||||
`$_XNOR_`, `$_AOI3_`, `$_OAI3_`, `$_AOI4_`, `$_OAI4_`, `$_MUX_`, `$_MUX4_`,
|
|
||||||
`$_MUX8_`, `$_MUX16_` and `$_NMUX_` are used to model combinatorial logic. The
|
|
||||||
cell type `$_TBUF_` is used to model tristate logic.
|
|
||||||
|
|
||||||
The `$_MUX4_`, `$_MUX8_` and `$_MUX16_` cells are used to model wide muxes, and
|
|
||||||
correspond to the following Verilog code:
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
// $_MUX4_
|
|
||||||
assign Y = T ? (S ? D : C) :
|
|
||||||
(S ? B : A);
|
|
||||||
// $_MUX8_
|
|
||||||
assign Y = U ? T ? (S ? H : G) :
|
|
||||||
(S ? F : E) :
|
|
||||||
T ? (S ? D : C) :
|
|
||||||
(S ? B : A);
|
|
||||||
// $_MUX16_
|
|
||||||
assign Y = V ? U ? T ? (S ? P : O) :
|
|
||||||
(S ? N : M) :
|
|
||||||
T ? (S ? L : K) :
|
|
||||||
(S ? J : I) :
|
|
||||||
U ? T ? (S ? H : G) :
|
|
||||||
(S ? F : E) :
|
|
||||||
T ? (S ? D : C) :
|
|
||||||
(S ? B : A);
|
|
||||||
|
|
||||||
The cell types `$_DFF_N_` and `$_DFF_P_` represent d-type flip-flops.
|
|
||||||
|
|
||||||
The cell types ``$_DFFE_[NP][NP]_`` implement d-type flip-flops with enable. The
|
|
||||||
values in the table for these cell types relate to the following Verilog code
|
|
||||||
template.
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @(CLK_EDGE C)
|
|
||||||
if (EN == EN_LVL)
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types ``$_DFF_[NP][NP][01]_`` implement d-type flip-flops with
|
|
||||||
asynchronous reset. The values in the table for these cell types relate to the
|
|
||||||
following Verilog code template, where ``RST_EDGE`` is ``posedge`` if
|
|
||||||
``RST_LVL`` if ``1``, and ``negedge`` otherwise.
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @(CLK_EDGE C, RST_EDGE R)
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= RST_VAL;
|
|
||||||
else
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types ``$_SDFF_[NP][NP][01]_`` implement d-type flip-flops with
|
|
||||||
synchronous reset. The values in the table for these cell types relate to the
|
|
||||||
following Verilog code template:
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @(CLK_EDGE C)
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= RST_VAL;
|
|
||||||
else
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types ``$_DFFE_[NP][NP][01][NP]_`` implement d-type flip-flops with
|
|
||||||
asynchronous reset and enable. The values in the table for these cell types
|
|
||||||
relate to the following Verilog code template, where ``RST_EDGE`` is ``posedge``
|
|
||||||
if ``RST_LVL`` if ``1``, and ``negedge`` otherwise.
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @(CLK_EDGE C, RST_EDGE R)
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= RST_VAL;
|
|
||||||
else if (EN == EN_LVL)
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types ``$_SDFFE_[NP][NP][01][NP]_`` implement d-type flip-flops with
|
|
||||||
synchronous reset and enable, with reset having priority over enable. The values
|
|
||||||
in the table for these cell types relate to the following Verilog code template:
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @(CLK_EDGE C)
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= RST_VAL;
|
|
||||||
else if (EN == EN_LVL)
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types ``$_SDFFCE_[NP][NP][01][NP]_`` implement d-type flip-flops with
|
|
||||||
synchronous reset and enable, with enable having priority over reset. The values
|
|
||||||
in the table for these cell types relate to the following Verilog code template:
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @(CLK_EDGE C)
|
|
||||||
if (EN == EN_LVL)
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= RST_VAL;
|
|
||||||
else
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types ``$_DFFSR_[NP][NP][NP]_`` implement d-type flip-flops with
|
|
||||||
asynchronous set and reset. The values in the table for these cell types relate
|
|
||||||
to the following Verilog code template, where ``RST_EDGE`` is ``posedge`` if
|
|
||||||
``RST_LVL`` if ``1``, ``negedge`` otherwise, and ``SET_EDGE`` is ``posedge`` if
|
|
||||||
``SET_LVL`` if ``1``, ``negedge`` otherwise.
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @(CLK_EDGE C, RST_EDGE R, SET_EDGE S)
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= 0;
|
|
||||||
else if (S == SET_LVL)
|
|
||||||
Q <= 1;
|
|
||||||
else
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types ``$_DFFSRE_[NP][NP][NP][NP]_`` implement d-type flip-flops with
|
|
||||||
asynchronous set and reset and enable. The values in the table for these cell
|
|
||||||
types relate to the following Verilog code template, where ``RST_EDGE`` is
|
|
||||||
``posedge`` if ``RST_LVL`` if ``1``, ``negedge`` otherwise, and ``SET_EDGE`` is
|
|
||||||
``posedge`` if ``SET_LVL`` if ``1``, ``negedge`` otherwise.
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @(CLK_EDGE C, RST_EDGE R, SET_EDGE S)
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= 0;
|
|
||||||
else if (S == SET_LVL)
|
|
||||||
Q <= 1;
|
|
||||||
else if (E == EN_LVL)
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types `$_DLATCH_N_` and `$_DLATCH_P_` represent d-type latches.
|
|
||||||
|
|
||||||
The cell types ``$_DLATCH_[NP][NP][01]_`` implement d-type latches with reset.
|
|
||||||
The values in the table for these cell types relate to the following Verilog
|
|
||||||
code template:
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @*
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= RST_VAL;
|
|
||||||
else if (E == EN_LVL)
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types ``$_DLATCHSR_[NP][NP][NP]_`` implement d-type latches with set
|
|
||||||
and reset. The values in the table for these cell types relate to the following
|
|
||||||
Verilog code template:
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @*
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= 0;
|
|
||||||
else if (S == SET_LVL)
|
|
||||||
Q <= 1;
|
|
||||||
else if (E == EN_LVL)
|
|
||||||
Q <= D;
|
|
||||||
|
|
||||||
The cell types ``$_SR_[NP][NP]_`` implement sr-type latches. The values in the
|
|
||||||
table for these cell types relate to the following Verilog code template:
|
|
||||||
|
|
||||||
.. code-block:: verilog
|
|
||||||
:force:
|
|
||||||
|
|
||||||
always @*
|
|
||||||
if (R == RST_LVL)
|
|
||||||
Q <= 0;
|
|
||||||
else if (S == SET_LVL)
|
|
||||||
Q <= 1;
|
|
||||||
|
|
||||||
In most cases gate level logic networks are created from RTL networks using the
|
In most cases gate level logic networks are created from RTL networks using the
|
||||||
techmap pass. The flip-flop cells from the gate level logic network can be
|
techmap pass. The flip-flop cells from the gate level logic network can be
|
||||||
|
@ -394,4 +19,18 @@ file via ABC using the abc pass.
|
||||||
:caption: Gate-level cells
|
:caption: Gate-level cells
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
/cell/gate_other
|
/cell/gate_comb_simple
|
||||||
|
/cell/gate_comb_combined
|
||||||
|
/cell/gate_reg_ff
|
||||||
|
/cell/gate_reg_latch
|
||||||
|
|
||||||
|
.. TODO:: Find a home for `$_TBUF_`
|
||||||
|
|
||||||
|
.. this should raise a warning, otherwise there are gate-level cells without a
|
||||||
|
'group' tag
|
||||||
|
|
||||||
|
.. autocellgroup:: gate_other
|
||||||
|
:caption: Other gate-level cells
|
||||||
|
:members:
|
||||||
|
:source:
|
||||||
|
:linenos:
|
||||||
|
|
Loading…
Reference in a new issue