
Сообщение от
gid
Вот например, строки 1540-1541:
Код:
assign cpred = {c[14:0], cl};
assign c = (cpred & oxy) | (~cpred & axy & oxy);
Дык, это не замкнутая петля. Каждый бит результата сам от себя не зависит, а только от предыдущего разряда. Перепишем явно с указанием разрядов:
Код:
assign cpred[15:0] = {c[14:0], cl};
assign c[15:0] = (cpred[15:0] & oxy[15:0]) | (~cpred[15:0] & axy[15:0] & oxy[15:0]);
Затем рассмотрим, например, разряд c[1]:
Код:
assign cpred[1] = c[0];
assign c[1] = (cpred[1] & oxy[1]) | (~cpred[1] & axy[1] & oxy[1]);
Делаем подстановку:
Код:
assign c[1] = (c[0] & oxy[1]) | (~c[0] & axy[1] & oxy[1]);
Итого: c[i+1] зависит от c[i], но никак от самого себя. Вычисляем их в таком порядке: c[0], c[1] ... c[14], c[15] и удается все вычислить за один проход. Ну или через сдвиг сразу словом.
Update: тут я, кажется, погорячился - сразу за одну операцию не получится, надо вычислять именно последовательно - разряд за разрядом.

Сообщение от
gid
Кстати, в alwaysе, начинающемся со строки 1014, с комментарием "ACLO edge detectors" нет ошибки? Там висящий блок begin end, который перебивает действие того, что было сделано ранее.
Да, спасибо, это ошибка, согласно схемы должно быть так:
Код:
always @(posedge pin_clk_p)
begin
if (reset | aclo_ack)
aclo <= 1'b0;
else
if (~pin_aclo)
aclo <= 1'b1;
if (pin_dclo | aclo_ack)
acok <= 1'b0;
else
if (pin_aclo)
acok <= 1'b1;
end

Сообщение от
gid
Например модуль vm1_vgen у меня выродился в одну линейную функцию из простых присваиваний, alwaysы там оказались не нужны.
Да, это вот такой верилог, always @(*) вырождается/представляется в набор assign. В-общем-то, и наоборот все assign-ы можно переписать через always @(*). Но я сознательно использовал always для триггеров, а assign для комбинационной логики. Но пару мест все-таки попалось, где это введенное мной стилистическое правило не соблюлось.

Сообщение от
gid
модуля, дискретным состояниям. Поэтому наверняка субмодуль можно описать в виде триггера блоком(ами) always с условиями которые соответствуют условиям always внутри субмодуля.
Это да, а в чем вопрос? Представить модуль в виде объекта С++? Можно, но метод always объекта надо будет вызывать в методе always всей системы, и надо будет мониторить изменение выходов объекта. А если совсем не лезть внутрь, то не получится проанализировать и выстроить assign-ы так чтобы вычислить за один проход.