Tengo la siguiente asignación combinatoria en un módulo verilog:
assign ififo_di = fetching_pc ? { 5'h02, 3'h7, 16'h8000 } : decoded_insn;
donde ififo_di
es una salida, fetching_pc
es un registro local y decoded_insn
es una entrada (que, en todas mis pruebas hasta ahora, siempre se establece en 24'h000000).
Y tiene una acción activada por reloj que establece fetching_pc
para un solo ciclo en circunstancias específicas. El mismo bloque también proporciona un reinicio sincrónico y configura un monitor para propósitos de depuración:
always @(posedge clk)
begin
fetching_pc <= !reset & next_task_ready;
if (reset)
begin
// reset registers
$display ("ifetch reset");
$monitor ("active: %b, task_loaded: %b, fetching_pc: %b, ififo_di: %b", active, task_loaded, fetching_pc, ififo_di);
active <= 0;
task_loaded <= 0;
end
end
El código del banco de pruebas que activa estas acciones es:
@(posedge clk);
reset = 1;
@(posedge clk);
reset = 0;
@(posedge clk) #10;
next_task_channel = 3;
next_task_thread = 0;
next_task_ready = 1;
@(posedge clk) #10;
// at this point the ififo_di output is checked and the test fails
En el momento en que la entrada next_task_ready
se establece en 1, la entrada reset
es 0, y los registros internos active
y task_loaded
se verifican como que contienen 0 (aunque task_loaded
se cambia a 1 en el mismo ciclo, pero al modificar esto para que este cambio no se produzca se obtienen resultados idénticos).
Mi expectativa es que cuando esto suceda, ififo_di
cambiará de 000000h a 178000h, sin embargo, lo que realmente sucede (las pruebas en icarus verilog) es la siguiente:
ifetch reset
active: 0, task_loaded: 0, fetching_pc: 0, ififo_di: 000000000000000000000000
ifetch reset
active: 0, task_loaded: 0, fetching_pc: 0, ififo_di: 000000000000000000000000
active: 0, task_loaded: 0, fetching_pc: 1, ififo_di: 000x0xxxx000000000000000
¿Por qué la salida cambiaría los bits que deben cambiarse a x
en lugar de a 1 como se esperaba? Comprendería si fetching_pc
fuera x
, pero claramente se muestra en la salida del monitor como 1, ¿qué está pasando aquí?
(actualizado: eliminé algunos códigos innecesarios para que pueda proporcionar todo el bloque always
tal como se probó, mostrando así todo el contenido potencialmente relevante del módulo).