mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-13 04:28:18 +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).
48 lines
1.2 KiB
Verilog
48 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
|
|
|