mirror of
https://github.com/YosysHQ/yosys
synced 2026-03-17 18:43:47 +00:00
This commit tries to carefully follow the documented behavior of LSE
and Synplify. It will use `syn_ramstyle` attribute if there are any
write ports, and `syn_romstyle` attribute otherwise.
* LSE supports both `syn_ramstyle` and `syn_romstyle`.
* Synplify only supports `syn_ramstyle`, with same values as LSE.
* Synplify also supports `syn_rw_conflict_logic`, which is not
documented as supported for LSE.
Limitations of the Yosys implementation:
* LSE/Synplify appear to interpret attribute values insensitive
to case. There is currently no way to do this in Yosys (attrmap
can only change case of attribute names).
* LSE/Synplify support `syn_ramstyle="block_ram,no_rw_check"`
syntax to turn off insertion of transparency logic. There is
currently no way to support multiple valued attributes in
memory_bram. It is also not clear if that is a good idea, since
it can cause sim/synth mismatches.
* LSE/Synplify/1364.1 support block ROM inference from full case
statements. Yosys does not currently perform this transformation.
* LSE/Synplify propagate `syn_ramstyle`/`syn_romstyle` attributes
from the module to the inner memories. There is currently no way
to do this in Yosys (attrmvcp only works on cells and wires).
99 lines
1.9 KiB
Text
99 lines
1.9 KiB
Text
bram $__ICE40_RAM4K_M0
|
|
init 1
|
|
abits 8
|
|
dbits 16
|
|
groups 2
|
|
ports 1 1
|
|
wrmode 0 1
|
|
enable 1 16
|
|
transp 0 0
|
|
clocks 2 3
|
|
clkpol 2 3
|
|
endbram
|
|
|
|
bram $__ICE40_RAM4K_M123
|
|
init 1
|
|
abits 9 @M1
|
|
dbits 8 @M1
|
|
abits 10 @M2
|
|
dbits 4 @M2
|
|
abits 11 @M3
|
|
dbits 2 @M3
|
|
groups 2
|
|
ports 1 1
|
|
wrmode 0 1
|
|
enable 1 1
|
|
transp 0 0
|
|
clocks 2 3
|
|
clkpol 2 3
|
|
endbram
|
|
|
|
# The syn_* attributes are described in:
|
|
# https://www.latticesemi.com/-/media/LatticeSemi/Documents/Tutorials/AK/LatticeDiamondTutorial311.ashx
|
|
|
|
match $__ICE40_RAM4K_M0
|
|
# implicitly requested RAM or ROM
|
|
attribute !syn_ramstyle syn_ramstyle=auto
|
|
attribute !syn_romstyle syn_romstyle=auto
|
|
attribute !ram_block
|
|
attribute !rom_block
|
|
attribute !logic_block
|
|
min efficiency 2
|
|
make_transp
|
|
or_next_if_better
|
|
endmatch
|
|
|
|
match $__ICE40_RAM4K_M0
|
|
# explicitly requested RAM
|
|
attribute syn_ramstyle=block_ram ram_block
|
|
attribute !syn_romstyle
|
|
attribute !rom_block
|
|
attribute !logic_block
|
|
min wports 1
|
|
make_transp
|
|
or_next_if_better
|
|
endmatch
|
|
|
|
match $__ICE40_RAM4K_M0
|
|
# explicitly requested ROM
|
|
attribute syn_romstyle=ebr rom_block
|
|
attribute !syn_ramstyle
|
|
attribute !ram_block
|
|
attribute !logic_block
|
|
max wports 0
|
|
make_transp
|
|
or_next_if_better
|
|
endmatch
|
|
|
|
match $__ICE40_RAM4K_M123
|
|
# implicitly requested RAM or ROM
|
|
attribute !syn_ramstyle syn_ramstyle=auto
|
|
attribute !syn_romstyle syn_romstyle=auto
|
|
attribute !ram_block
|
|
attribute !rom_block
|
|
attribute !logic_block
|
|
min efficiency 2
|
|
make_transp
|
|
or_next_if_better
|
|
endmatch
|
|
|
|
match $__ICE40_RAM4K_M123
|
|
# explicitly requested RAM
|
|
attribute syn_ramstyle=block_ram ram_block
|
|
attribute !syn_romstyle
|
|
attribute !rom_block
|
|
attribute !logic_block
|
|
min wports 1
|
|
make_transp
|
|
or_next_if_better
|
|
endmatch
|
|
|
|
match $__ICE40_RAM4K_M123
|
|
# explicitly requested ROM
|
|
attribute syn_romstyle=ebr rom_block
|
|
attribute !syn_ramstyle
|
|
attribute !ram_block
|
|
attribute !logic_block
|
|
max wports 0
|
|
make_transp
|
|
endmatch
|