En mi experiencia, manejar una red desde dos procesos separados (o siempre bloques) es una mala idea y dará como resultado un error de varios controladores en las herramientas.
Sin embargo, uno de mis conocidos afirma que si las asignaciones de señal están contenidas dentro de las declaraciones if
que nunca afirman al mismo tiempo, debería ser posible controlar una señal desde dos bloques siempre.
Como prueba, hice esto en Vivado 2014.4. Aquí está mi código de prueba muy trivial:
// always block one
always @ (posedge clk) begin
if (rst) begin
RegA <= 0;
end
else begin
if (RegA_in_valid_1) begin
RegA <= RegA_in_1;
end
end
end
// Always block two
always @ (posedge clk) begin
if (rst == 0) begin
if (!RegA_in_valid_1 && RegA_in_valid_2)
RegA <= RegA_in_2;
end
end
Como esperaba, Vivado produce errores:
[Synth 8-3352] multi-driven net RegA_out_OBUF[31] with 1st driver pin 'RegA_reg[31]__0/Q'
...
Después de esta prueba, dicho conocido aún afirma que este código se sintetizaría en versiones anteriores de Vivado sin errores. Esto me hizo pensar: ¿qué utiliza la herramienta de síntesis para determinar si una red tiene múltiples motores? ¿Utiliza las respectivas listas de sensibilidad, o este mecanismo es factible (usando declaraciones condicionales)? Veo que mi versión de Vivado no funciona, pero ¿cuál es el consenso en general?