Salidas indeterminadas inesperadas del operador condicional verilog

0

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).

    
pregunta Jules

1 respuesta

0

Encontré la respuesta, y fue de una fuente sorprendente: el código del banco de pruebas tenía una conexión definida incorrectamente para la salida ififo_di :

wire ififo_di = 0;

Los 1s producidos se fusionaron con los ceros conectados a la salida y generaron un resultado indeterminado; Naturalmente, habría esperado que esto fuera una condición de error, pero parece que no lo es.

    
respondido por el Jules

Lea otras preguntas en las etiquetas