Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
Announcements
Intel Support hours are Monday-Fridays, 8am-5pm PST, except Holidays. Thanks to our community members who provide support during our down time or before we get to your questions. We appreciate you!

Need Forum Guidance? Click here
Search our FPGA Knowledge Articles here.
15481 Discussions

Lite: 17.1 upgrade to 20.1, now ramstyle not working, getting logic, not M9K blocks, won't fit

dickelbeck
Beginner
263 Views

This code was working on Lite 17.1, and not is not.  The compiler path is correct, the (*ramstyle*) is being seen.  I verified this by temporarily putting bad syntax before the troublesome line.

Vendor neutral approach to dual port ram:

------------------------


module simple_dual_port_ram #(
parameter addrwidth = 8,
parameter datawidth = 32,
parameter block_ram_type = ""
)
(
input rst_i,
input rd_clk_i,
input rd_en_i,
input [addrwidth-1:0] rd_addr_i,
output [datawidth-1:0] rd_data_o,

input wr_clk_i,
input wr_en_i,
input [addrwidth-1:0] wr_addr_i,
input [datawidth-1:0] wr_data_i
);

localparam memdepth = 2**addrwidth;

generate
`ifdef IS_QUARTUS
if( block_ram_type == "cyclone10_m9k" ) begin : gen
(* ramstyle = "M9K" *) reg [datawidth-1:0] mem[memdepth-1:0];
end
else begin
reg BUG; // reg [datawidth-1:0] mem[memdepth-1:0];
end
`else
// http://www.latticesemi.com/en/Support/AnswerDatabase/7/3/735
if( block_ram_type == "lattice_pmi" ) begin : gen
reg [datawidth-1:0] mem[memdepth-1:0] /* synthesis syn_ramstyle = "block_ram" */;
end
else begin : gen
reg [datawidth-1:0] mem[memdepth-1:0];
end
`endif
endgenerate


assign rd_data_o = gen.mem[rd_addr_i];


always @( posedge wr_clk_i )
if( wr_en_i ) begin
//$display( "wr[%d]=%x", wr_addr_i, wr_data_i );
gen.mem[wr_addr_i] <= wr_data_i;
end

endmodule

// save for later
// /* synthesis ramstyle = "M9K, no_rw_check" */;

 

0 Kudos
3 Replies
dickelbeck
Beginner
258 Views

17.1 compiles this and it fits, easily.  But during the compilation I see a message that I don't see with v. 20.1:

 

Warning (276020): Inferred RAM node "uart_wishbone:uart0|uart_core:uart|uart_send:transmitter|bram_fifo:tx_fifo|block_ram:fifo_ram|simple_dual_port_ram:dualp_ram|gen.mem_rtl_0" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design.

 

I sure like the part where it says, "Inferred RAM node...

 

Do I have to go back to 17.1?

 

RichardTanSY_Intel
239 Views

You described a set of registers in a Verilog Design File (.v) or VHDL Design File (.vhd) that behave as RAM. Analysis & Synthesis then replaces the registers with a RAM node that will later infer an instance of the altsyncram megafunction to implement the functionality of the registers using the memory blocks in the target device.

For further information related to this error, you can refer to this link: 
https://www.intel.com/content/www/us/en/programmable/quartushelp/current/index.htm#msgs/msgs/winfer_...

dickelbeck
Beginner
198 Views

I think the lite version was dumbed down maybe to incentivise people to upgrade to pro version of the software.  Or, I think there is a bug here.

 

I found it easiest just to stay with version 17.x which continues to handle this situation as I want.

Reply