如何在Verilog中定义和初始化仅包含1的向量?

问题描述 投票:0回答:3

如果我想声明一个全为 128 位的向量,这些方法中哪一种总是正确的?

wire [127:0] mywire;

assign mywire = 128'b1;
assign mywire = {128{1'b1}};
assign mywire = 128'hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
verilog system-verilog register-transfer-level
3个回答
29
投票

快速模拟将证明,

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;

18
投票

我会用下面的语句来代替:

assign mywire = ~0;

在这样的简单表达式中,赋值左侧的宽度设置右侧表达式的宽度。因此,

0
(一个 32 位常量)首先扩展到 mywire 的完整 128 位,然后翻转所有位并分配生成的全 1 向量。

我更喜欢这个版本,因为它不需要您在作业中的任何位置指定 mywire 的宽度。


0
投票

分配 mywire = {32{4'HF}}; // 32组HF(32 * 4bits = 128位) 分配 mywire = {8{16'HFFFF}}; // 8组0xFFFF = FFFF_FFFF_FFFF_FFFF... 这称为重复运算符 {重复{表达式}}

© www.soinside.com 2019 - 2024. All rights reserved.