Если я хочу объявить 128-битный вектор всех единиц, какой из этих методов всегда правильный?
wire [127:0] mywire;
assign mywire = 128'b1;
assign mywire = {128{1'b1}};
assign mywire = 128'hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
Если я хочу объявить 128-битный вектор всех единиц, какой из этих методов всегда правильный?
wire [127:0] mywire;
assign mywire = 128'b1;
assign mywire = {128{1'b1}};
assign mywire = 128'hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
Как показало быстрое моделирование, 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;
Вместо этого я бы использовал следующее утверждение:
assign mywire = ~0;
в таком простом выражении ширина в левой части присваивания задает ширину выражения в правой части. Таким образом, 0
, 32-битная константа, сначала расширяется до полных 128 бит mywire, затем все биты переворачиваются и результирующий вектор всех единиц назначается.
Я бы предпочел эту версию, потому что она не требует, чтобы вы указывали ширину mywire где-либо в задании.