Tomé un ejemplo del sitio web que describe la serie de 8 bits en el registro de salida a la izquierda de la serie.
module shift (clk, si, so);
input clk,si;
output so;
reg [7:0] tmp;
always @(posedge clk)
begin
tmp <= tmp << 1;
tmp[0] <= si;
end
assign so = tmp[7];
endmodule
del ejemplo anterior, creo que esta es una implementación extraña. Esto se debe a que, dentro de always
, cuando tmp[0] <= si;
se ejecuta primero, tomaremos una salida inesperada.
Por ejemplo, supongamos que si
es 1, y cuando tmp
es:
1010 1010
y, cuando tmp[0] <= si;
se ejecuta primero (lo que hará una salida inesperada), la salida es:
0101 0110
Pero, si las instrucciones always
se ejecutan secuencialmente como se escribe en el ejemplo anterior, la salida es
0101 0101
Como resultado, no podemos garantizar que el resultado sea el que esperábamos.
Estoy en lo cierto? Por lo tanto, la implementación correcta debe ser:
tmp <= (tmp << 1) + {7'b0000_000, si};
O, ¿podemos probar que el ejemplo anterior siempre se ejecuta secuencialmente?