BRAM HX1K vs HX4k

44 views
Skip to first unread message

Jesus Arias

unread,
Oct 27, 2023, 3:34:52 AM10/27/23
to FPGAwars: explorando el lado libre
Hi,
While trying to simulate an asynchronous RAM I resorted to read a BRAM block on the falling edges and to write on the rising edges:

reg  [7:0]RAM[0:((1<<AW)-1)];

reg [7:0]ramout;
always @(negedge clk) ramout<=RAM[aram[(AW-1):0]];
always @(posedge clk) if (wrm) RAM[aram]<=ramin;

The strange thing is that this code runs as expected in an ICE40HX1K but it fails in an ICE40HX4K.
Does anybody know something about it? reports are welcome.

Regards

-----------

Hola,
He intentado simular una RAM asíncrona usando un flanco de bajada en las lecturas y uno de subida en las escrituras en una BRAM. (ver código verilog anterior)

Lo raro es que este código funciona bien en una ICE40HX1K pero no lo hace en una ICE40HX4K.

Si alguien sabe algo al respecto le agradecería que lo contase.
Saludos


Jesus Arias

unread,
Oct 27, 2023, 3:55:55 AM10/27/23
to FPGAwars: explorando el lado libre
And also this patch fix the problem for the 4K FPGA:

reg  [7:0]RAM[0:(RAMDATOS-1)];
//wire [7:0]ramout=RAM[aram[(AW-1):0]];
wire mclk;
SB_LUT4 #(.LUT_INIT(16'b01)) inverter0 (.O(mclk),.I0(  clk), .I1(1'b0), .I2(1'b0), .I3(1'b0));
reg [7:0]ramout;
always @(posedge mclk) ramout<=RAM[aram[(AW-1):0]];
always @(posedge clk) if (wrm) RAM[aram[(AW-1):0]]<=aluout;

I'm suspecting I found a bug in nextpnr...

charli va

unread,
Oct 27, 2023, 4:23:04 AM10/27/23
to fpga-wars-explora...@googlegroups.com
Hi Jesus! Until the afternoon i can’t try it but later i test it .

What versión of oss cad tools are you using? 

Thanks a lot!

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/a28409f7-3b5a-4c1b-89c9-375b0ed716d8n%40googlegroups.com.

Jesus Arias

unread,
Oct 27, 2023, 4:50:36 AM10/27/23
to FPGAwars: explorando el lado libre
Yosys 0.9+4052 (git sha1 a58571d0, clang 11.0.0-2 -fPIC -Os)
nextpnr-ice40 -- Next Generation Place and Route (Version nextpnr-0.4-25-g445d3249)

Gracias

charli va

unread,
Oct 27, 2023, 12:14:04 PM10/27/23
to fpga-wars-explora...@googlegroups.com
Hola Jesús, me he hecho un pequeño diseño en icestudio con tu verilog original para la alhambra ii (ice40hx4k).

Lo que he hecho es esto:

module main_v480f30 #(
 parameter AW = 0
) (
 input clk,
 input [7:0] ramin,
 input [15:0] aram,
 input wrm,
 output [7:0] rmout
);

 reg  [7:0]RAM[0:((1<<AW)-1)];
reg [7:0]ramout;
always @(negedge clk) ramout<=RAM[aram[(AW-1):0]];
always @(posedge clk) if (wrm) RAM[aram]<=ramin;

assign rmout = ramout;
endmodule


He hecho una prueba probando con una memoria de 16 bits de direcciones (en el código para icestudio es cambiar  el parámetro por defecto AW a 16 y ha funcionado perfectamente.

La versión de yosys que uso en icestudio wip es Yosys 0.33+103 (git sha1 11ffd7df4) que es bastante más nuevo que el que tienes instalado por lo que me imagino que has dado con algún antiguo bug de yosys que ya debe de estar resuelto. Te recomiendo que lo actualices porque se han mejorado muchas cosas.

Adjunto el .ice por si alguien tiene curiosidad de probar tu ram asíncrona, me ha parecido muy interesante la verdad, nunca las he puesto en práctica y tiene buena pinta.

 El test simplemente mete una constante para el dato a escribir y una constante para la dirección a escribir/leer el dato, con el botón 1 de la alhambra guarda el dato en la dirección indicada y se muestra por los leds.

Por otro lado quería aprovechar a hacerte una pregunta, porque no me queda claro, en la sentencia:

RAM[aram[(AW-1):0]]


¿aram[(AW-1):0].  no es redundante a poner sólo aram? o tiene algún objetivo que optimice o elimine algún tipo de imprecisión en la síntesis?


Muchas gracias Jesús!


async_ram.ice

Jesus Arias

unread,
Oct 27, 2023, 1:58:03 PM10/27/23
to FPGAwars: explorando el lado libre
Hola, gracias por la comprobación...
El problema lo he de tener en "nextpnr" pues la salida de yosys es exactamente la misma para las dos FPGAs.
Y ciertamente es una versión un tanto vieja, aunque ya sabes "si funciona no lo arregle" ;)
Respecto de RAM[aram[(AW-1):0]] es simplemente para no salirme de límites si la memoria es de menos de 256 bytes, porque aram es de 8 bits. (AW = $clog2(SIZE)). Seguramente esto es algo redundante.

Saludos

charli va

unread,
Oct 27, 2023, 3:03:54 PM10/27/23
to fpga-wars-explora...@googlegroups.com
Gracias Jesús por la aclaración , me imaginaba que era algo así pero nunca había visto esa sintaxis y al probarlo como he visto que era equivalente intuía que iban por ahí los tiros.

Pero me lo apunto porque realmente si que le veo mucha utilidad para evitar desbordamientos.

Muchas gracias!

Jesus Arias

unread,
Oct 27, 2023, 4:53:57 PM10/27/23
to FPGAwars: explorando el lado libre
En efecto, era un problema de nextpnr. Tras bajar de gitHub una version reciente ya no pasa.
Muchas gracias por la asistencia

charli va

unread,
Oct 28, 2023, 2:05:03 AM10/28/23
to fpga-wars-explora...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages