Comportamiento extraño en la union de bits
Publicado: 07 Dic 2021, 12:22
Hola,
He observado un comportamiento extraño con la unión de bits, no se si se trata de un error del sintetizador de Xilinx pero me gustaría entender exactamente por qué se produce, a ver si alguien tiene alguna idea. Partimos de este código:
El carácter charbits se obtiene a partir de buffer char_rom, desplazándonos 800h en caso de que thin_font invertido sea 1. Pues bien, tal y como indico en el comentario, esto no siempre se aplica. Y es que inicialmente me funcionaba, pero haciendo limpieza de código en otros módulos de repente dejó de funcionar, no aplicando el desplazamiento en ningún caso... como ignorando ese bit alto.
Es extraño, porque por ejemplo esto lo soluciona:
La solución que más sentido tiene para mi es hacer lo mismo pero de diferente manera, para saltarme este extraño comportamiento:
Dicho lo cuál, ¿alguien entiende qué puede estar sucediendo y cuál es el problema realmente?
He observado un comportamiento extraño con la unión de bits, no se si se trata de un error del sintetizador de Xilinx pero me gustaría entender exactamente por qué se produce, a ver si alguien tiene alguna idea. Partimos de este código:
Código: Seleccionar todo
module cga_pixel(
...
input thin_font,
...
);
reg[7:0] char_rom[0:4095];
reg[7:0] charbits;
initial $readmemh("cga.hex", char_rom, 0, 4095);
always @ (posedge clk)
begin
// Only load character bits at this point
if (...) begin
charbits <= char_rom[{~thin_font,rom_addr}]; // El bit alto (thin_font invertido) se aplica o no dependiendo del resto de código. ¿problema del sintetizador de Xilinx?
end
end
Es extraño, porque por ejemplo esto lo soluciona:
Código: Seleccionar todo
reg[7:0] char_rom[0:4096]; // 4096 en lugar de 4095 lo soluciona, pero no explica el problema, al igual que teniendo otro código en otros módulos que nada tiene que ver con este buffer.
Código: Seleccionar todo
charbits <= char_rom[{~thin_font, 11'd0} | rom_addr]; // Fix correcto, pero habría que entender por qué hay que llegar a este punto para hacer lo mismo, ya que puede provocar otros comportamientos extraños en el core y habría que saber exactamente por qué se produce para aplicar la solución correcta en cada caso.