Цитата(torik @ Dec 9 2009, 23:06)

Теперь вместо reg назовем переменную logic, результат такой же как и для reg, т.е. опять нужен initial.
Если же назвать переменные bit, которые могут принимать лишь 2 значения - 0 и 1, то все прекрасно работает без initial.
вы ещё забываете о таком замечательном действии как инлайн инициализация
Код
reg x=1'b0;
в этом случае переменная приобретает значение ещё до начала симуляционного времени (initial, если я не ошибаюсь, тоже присваивает значение до модельного времени//конечно если не стоит задержка #0)
Цитата(torik @ Dec 9 2009, 23:06)

Вроде бы, можно сказать, что wire - это просто соединение, а reg - комбинационная логика, на ней уже можно строить тригеры и прочее.
противопоставлять wire и reg/bit некорректно, корректно противопоставлять wire и var, т.е. есть типы
данных(reg, int, string, my_type) и есть вид(или класс или тип)
объекта(сигнал/переменная/параметр/макрос-переменная(genvar))
типам данных присущи множества/диапазоны значений и структура;
классы объекта составляют парадигму языка. ну например, genvar - это переменная препроцессора, параметр - переменная времени компиляции, сигналу присущи свойства уровнем абстракции ниже логического(физические свойства) и у сигнала нет дискретного во времени состояния, т.е. действительно похож на провод: если его подключить к источнику, то по нему течёт ток, если изменить скачко образно силу тока, то по нему будет теч ток другой силы, но всё равно будет течь непрерывно, хотя уровень тока кака-будто бы дискретно изменился, а если его отключить от источника, то не будет течь никакой, т.е. у сигнала нет состояния в прошлом/настоящем/будущем у него есть только одно состояние "всегда", т.е. у сигнала нет памяти как у переменной; но говоря о памяти переменной ни в коем случае нельзя понимать её как память в модельном времени - т.е. как регистр/зачёлку, а только как память языковой парадигмы. лучше всего это показать на примере:
Код
(var) int a;
always_comb
begin
a=b;
a=a+1;
a=a**2;
a=a-1;
end
это не запоминающий элемент на практике, а комбинационная схема, что же помнит тогда a? а помнит своё предыдущее состояние (кстати, не только самое последнее, и даже не только прошлое).
то что при помощи переменной можно описать физическую память, это только производная от её свойств как класса объекта.
почему происходит постоянная путаница между этими понятиями? потому, что по умолчанию всё что явно не декларировано как сигнал, является переменной. т.е.
int a; на самом деле это
var int a;при этом необходимо помнить, что не корректно говорить об исключительном противопоставрении var - wire, так как по сути говоря, сигналы существуют 12 типов (по их "физическим" свойствам) т.е. корректное противопоставление было бы var - {wire,wor,wand,tri,,supply0 ...}
чем отличается сигнал от переменной на практике:
- сигнал может иметь несколько драйверов, переменная нет (т.е. синалу можно присваивать несколько значений одновременно, правило разрешения определит каким будет результирующее значение множественного присваивания), при этом переменной можно присваивать значения в нескольких блоках, однако это не будет считаться одновременным присваиванием, т.к. действует правило "кто прследний тот и папа" (но при этом если переменной присваивается значения оператором непрерывного присваивания, то это может быть только единственным присваиванием этой переменной);
- т.к. сигнал не может хранить значение ему нельзя присваивать значения в процедурных блоках, а только в операторах непрерывного присваивания assign (присваивание при объявлении сигнала и соединение с портом для сигнала считаются непрерывными присваиваниями), в то же время переменной можно присваивать значение в любых типах блоков а также оператором непрерывного присваивания assign, но если существует непрерывное присваивание, то это может быть единственным присваиванием данной переменной;
- переменная не может быть соединена с портом inout;