Tengo un código Verilog que simula correctamente. Decidí sintetizarlo y veo estas advertencias que me inquietan:
Signal <> missing in the sensitivity list is added for synthesis purposes. HDL and post-synthesis simulations may differ as a result.
Aproximadamente 20 del mismo tipo. No QUIERO que esas señales se agreguen a la lista de sensibilidad, realmente no lo hago. Todo lo que quiero es hacer cosas en los bordes del reloj, no cada vez que cambia una señal.
Dándole el beneficio de la duda, cambié mi proceso de
always @(posedge clk or negedge reset)
a:
always @(*)
Y, por supuesto, ninguna de mis cosas funcionó (en simulación). Probablemente porque las instrucciones de no bloqueo ahora están haciendo cosas cada vez que algo cambia, en lugar de esperar por los bordes del reloj.
¿Hay alguna manera de evitar que Verilog haga esto? Supongo que piensa que mi código es combinativo, en lugar de secuencial ... ¿Pero por qué? ¿Hay alguna manera de decirle que esto es secuencial y solo para usar el clk?
Gracias de antemano!
Editar, aquí hay un código, estoy eliminando algunas de las funciones:
always @(*) begin
// Some signals here that I apparently can't put in the other one
// Something about double edges
end
always @(posedge clk or negedge reset) begin
case (!reset)
0: begin
// Assign 0 to things
end
1: begin
p_spi_done <= spi_done; // Wants these to be in sensitivity list
case ((spi_done == 1) && (p_spi_done!=spi_done))
0: begin
case (helper_reg)
5'b00000: begin
// Do something else
end
5'b00001: begin
...
end
5'b00010: begin
....
end
5'b00100: begin
i_wData <= i_rDataA[SPI_WIDTH-1:0];
i_temp_reg <= i_rDataA[BANK_DATA_WIDTH-1:SPI_WIDTH];
helper_reg[3] <= 0;
end
5'b01000: begin
...
end
5'b10000: begin
...
end
default: begin
// Don't know what happened
helper_reg <= 0;
end
endcase
end
1: begin
case (cpu_state)
0: begin // SYNC HAS ARRIVED
if (spi_rx_data == SYNC_VALUE) begin
cpu_state <= 1;
end
end
1: begin
OPCODE <= spi_rx_data;
// Instruction set begins here
case (spi_rx_data)
0: begin
...
end
1: begin
...
end
2: begin
...
end
3: begin // Set maximum count value for watch unit
if (SPI_WIDTH > MAX_COUNT_LENGTH) begin
n_rx <= 1;
end
else begin
n_rx <= (MAX_COUNT_LENGTH + SPI_WIDTH/2)
/SPI_WIDTH; // Compiler truncates
end
cpu_state <= 2;
helper_reg[5] <= 1;
end
4: begin
end
5: begin
cpu_state <= 2;
end
default: begin
end
endcase
end
2: begin // DATA
case (OPCODE)
0: begin
end
1: begin
end
2: begin
.... and it goes on in this fashion