bigral, наверное не совсем так. Просто verilog, как и vhdl, создавался как язык для симуляции. К синтезу их притянули за уши потом. Фактически когда квартуз "компилирует" код, он находит соответствие увиденного какому-то набору шаблонов. Какие-то шаблоны допустимы, какие-то нет. Из-за этого страшная путаница и уже не первое поколение fpga-шников хочет выкинуть все и переписать с нуля.
В синтезируемом подмножестве с помощью always можно сделать несколько видов процессов. Пусть меня поправят настоящие сварщики, если я ошибаюсь.
1) Непрерывное присваивание.
Код:
reg r;
always @* r <= expression;
Это то же самое, что
Код:
wire w;
assign w = expression;
2) Защелка -- значение залипает пока не случится cond1 или cond2 (ататат! если это случайно -- надо синхронизировать с клоком).
Код:
reg r;
always @* begin
if (cond1) r <= 1;
else if (cond2) r <= 0;
// чтобы убрать защелочность достаточно добавить else
// else r <= 0;
end;
3) триггер
Код:
reg r;
always @(posedge clk) begin
r <= expression;
end
4) триггер с асинхронным сбросом
Код:
reg r;
always @(posedge clk or negedge reset_n)
if (!reset_n)
r <= 0;
else
r <= expression;
По-моему это всё. Все более сложные конструкции либо упрощаются до совпадения с одним из этих паттернов, либо приводят к ошибке синтеза. Каждый из этих случаев достаточно частный. Например, триггер с асинхронным сбросом возможен благодаря тому, что базовые логические элементы имеют асинхронный сброс и принципиально важно, что оба присваивания находятся во взаимоисключающих половинках if - else. Это не потому, что verilog позволяет тактировать один регистр двумя разными клоками. Просто туманность синтаксиса может ввести в заблуждение.
На VHDL регистры с асинхронным сбросом тоже возможны.

Сообщение от
bigral
а можно сюда скинуть кусок текста оттуда, ато тяжело мне понять как "люди редко пишут" и почему...
Мне сейчас не с руки откапывать. Идея в том, что человек как правило напишет:
Код:
always @(posedge clk)
if (c) r <= 1;
else r <= a & b;
или
Код:
always @(posedge clk)
r <= (a & b) | c;
Но все эти хитрые конструкции упрощаются к виду:
Код:
wire wire123 = (a & b) | c;
always @(posedge clk)
r <= wire123;
Только обычно сильно более сложные и запутанные. И именно такие они получаются в результате реверса.