mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +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
 | 
						|
 |