如果我想声明一个全为 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 位常量)首先扩展到 mywire 的完整 128 位,然后翻转所有位并分配生成的全 1 向量。
我更喜欢这个版本,因为它不需要您在作业中的任何位置指定 mywire 的宽度。
分配 mywire = {32{4'HF}}; // 32组HF(32 * 4bits = 128位) 分配 mywire = {8{16'HFFFF}}; // 8组0xFFFF = FFFF_FFFF_FFFF_FFFF... 这称为重复运算符 {重复{表达式}}