Как определить и инициализировать вектор, содержащий только единицы в Verilog?

Если я хочу объявить 128-битный вектор всех единиц, какой из этих методов всегда правильный?

wire [127:0] mywire;

assign mywire = 128'b1;
assign mywire = {128{1'b1}};
assign mywire = 128'hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

person Veridian    schedule 30.09.2013    source источник


Ответы (2)


Как показало быстрое моделирование, assign mywire = 128'b1; не присваивает всем битам mywire значение 1. Только биту 0 присваивается значение 1.

Оба следующих всегда присваивают всем 128 битам значение 1:

assign mywire = {128{1'b1}};
assign mywire = 128'hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

Одним из преимуществ первой строки является то, что ее легче масштабировать до ширины больше и меньше 128.

В SystemVerilog следующий синтаксис также всегда присваивает всем 128 битам значение 1:

assign mywire = '1;
person toolic    schedule 30.09.2013

Вместо этого я бы использовал следующее утверждение:

assign mywire = ~0;

в таком простом выражении ширина в левой части присваивания задает ширину выражения в правой части. Таким образом, 0, 32-битная константа, сначала расширяется до полных 128 бит mywire, затем все биты переворачиваются и результирующий вектор всех единиц назначается.

Я бы предпочел эту версию, потому что она не требует, чтобы вы указывали ширину mywire где-либо в задании.

person CliffordVienna    schedule 04.10.2013