mirror of
https://github.com/YosysHQ/yosys
synced 2025-10-24 00:14:36 +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).
47 lines
1.2 KiB
Verilog
47 lines
1.2 KiB
Verilog
`default_nettype none
|
|
module sync_ram_sp #(parameter DATA_WIDTH=8, ADDRESS_WIDTH=10)
|
|
(input wire write_enable, clk,
|
|
input wire [DATA_WIDTH-1:0] data_in,
|
|
input wire [ADDRESS_WIDTH-1:0] address_in,
|
|
output wire [DATA_WIDTH-1:0] data_out);
|
|
|
|
localparam WORD = (DATA_WIDTH-1);
|
|
localparam DEPTH = (2**ADDRESS_WIDTH-1);
|
|
|
|
reg [WORD:0] data_out_r;
|
|
reg [WORD:0] memory [0:DEPTH];
|
|
|
|
always @(posedge clk) begin
|
|
if (write_enable)
|
|
memory[address_in] <= data_in;
|
|
data_out_r <= memory[address_in];
|
|
end
|
|
|
|
assign data_out = data_out_r;
|
|
|
|
endmodule // sync_ram_sp
|
|
|
|
|
|
`default_nettype none
|
|
module sync_ram_sdp #(parameter DATA_WIDTH=8, ADDRESS_WIDTH=10)
|
|
(input wire clk, write_enable,
|
|
input wire [DATA_WIDTH-1:0] data_in,
|
|
input wire [ADDRESS_WIDTH-1:0] address_in_r, address_in_w,
|
|
output wire [DATA_WIDTH-1:0] data_out);
|
|
|
|
localparam WORD = (DATA_WIDTH-1);
|
|
localparam DEPTH = (2**ADDRESS_WIDTH-1);
|
|
|
|
reg [WORD:0] data_out_r;
|
|
reg [WORD:0] memory [0:DEPTH];
|
|
|
|
always @(posedge clk) begin
|
|
if (write_enable)
|
|
memory[address_in_w] <= data_in;
|
|
data_out_r <= memory[address_in_r];
|
|
end
|
|
|
|
assign data_out = data_out_r;
|
|
|
|
endmodule // sync_ram_sdp
|
|
|