Цитата Сообщение от gid Посмотреть сообщение
Вот этот момент, хоть убей, не могу понять, почему нет?
Я неточно выразился - нельзя представить как комбинационную функцию. Можно представить как объект класса с внутренним состоянием. То есть assign можно выразить как просто функцию без состояния, а вот always требует памяти внутри.

Цитата Сообщение от gid Посмотреть сообщение
нет необходимости. И как-то увязывать внутренности модуля vm1_timer с внутренностями модуля vm1_qbus вообще нет никаких причин. Тем более, что эмулируется обычно математическая модель, а не электрическая.
Увязывать надо в том смысле что должны правильно вычисляться комбинационные функции по всей системе в целом. А также должны щелкать все триггеры во всей системе одновременно. Например, выход таймера зависит от регистра счетчика, который по клоку готов инкрементироваться. И этот выход подключен к другому регистру внутри процессора, идет чтение регистра счетчика процессором, и регистр готов защелкнуть читаемое входное значение. Если сначала вызвать таймер - он инкрементируется, и при вызове обработки регистра-защетки чтения, будет защелкнуто неверное значение. Поэтому и предлагается решение - вычислить все функции подаваемые на триггеры, а по событию клока только перенести в триггеры.

Цитата Сообщение от gid Посмотреть сообщение
Ну как не может?
Код:
if (cond1)
  a <= val1;
else if (cond2)
  a <= val2;
else if (cond3)
  a <= val3;
Тут смотря какие cond, не указаны они ли в списке чувствительности always @() (как асинхронный сброс, например). Если нет, то можно переписать так:
Код:
  a <= cond1 ? val1 : (cond2 ? val2 : (cond3 ? val3 : a));
Или так (для битовой переменной)
Код:
  a <= (cond1 & val1)
     | (~cond1 & cond2 & val2)
     | (~cond1 & ~cond2 & cond3 & val3)
     | (~cond1 & ~cond2 & ~cond3 & a);
Ну и можно просто if-ы перенести в С++ при вычислении assign, тоже будет работать.

Цитата Сообщение от gid Посмотреть сообщение
В одну строку не запишешь, а если условия большие и сложные - вообще будет винегрет. А если конструкция case? Или я чего-то недопонимаю?
Тем более, сложные условия надо выносить из always, так проще для понимания. case на С++ в большинстве случаев так и опишется "в лоб". И case там у меня в двух местах всего, емнип.

Цитата Сообщение от gid Посмотреть сообщение
Имеется в виду c++ конструкции template<...>...{} ?
Я имел ввиду просто класс - внутренние переменные и методы. И мы их обсудили бы, для начала на очень простом 155ИР13 - там есть что обсудить для начала на самом простом примере, потом мы эти 155ИР13 скаскадируем по-разному, снова обсудим, а там уже до таймера доберемся.

Цитата Сообщение от gid Посмотреть сообщение
А я тут заново попытался сконвертировать верилатором Async\vm1.v
Следует взять ветку Qsync, она более предсказуема для моделирования, фазы сигналов в ней такие же, поэтому разницы нет, а моделятор написать будет проще. И в ветке Async есть always-ы с @(*) - на самом деле это assign , и петли обратной связи.

Цитата Сообщение от gid Посмотреть сообщение
Путём сравнения пришёл к выводу, что ему не нравится, что указанные переменные используются одновременно в always @(*) и always @(posedge pin_clk) кажется.
Да, но там назначаются разные биты массива, они не перекрываются, фактически это разные отдельные переменные, ничего не нарушено и ничего подозрительного. Но, видимо, появились какие-то дополнительные ограничения для успешной автогенерации С++ кода.