Примитивные ворота всегда одноразрядные. Вам необходимо создать экземпляр для каждой комбинации битов.
Самый распространенный способ - сгенерировать для -l oop. Генерация логики c проходит через этапы c, развернутые на этапе разработки компиляции.
genvar gidx;
wire ns;
wire [width-1:0] y1, y2;
not g1 (ns, s);
generate
for(gidx=0; gidx<width; gidx=gidx+1) begin : mux
and g2 (y1[gidx], d0[gidx], ns );
and g3 (y2[gidx], d1[gidx], s );
or g4 (y[gidx], y1[gidx], y2[gidx] );
end
endgenerate
Вы также можете создать диапазон экземпляров. Эта функция существует дольше, чем конструкция генерирования, но используется реже, и я замечаю, что некоторые синтезаторы ее не поддерживают (например, Yosys 0.9 на EDAplayground ).
wire ns;
wire [width-1:0] y1, y2;
not g1 (ns, s);
and g2 [width-1:0] (y1, d0, ns);
and g3 [width-1:0] (y2, d1, s);
or g4 [width-1:0] (y, y1, y2);