使用掩码的 System Verilog
System Verilog using mask
我无法理解这段代码的含义。
我知道 VHDL 并且需要系统 verilog。我不知道bits [num] = '{4, 4})
或(output logic [width-1:0] mask [num]);
的意思
请解释一下
module works
#(parameter int num = 4,
parameter int width = 8,
parameter int bits [num] = '{4, 4})
(output logic [width-1:0] mask [num]);
output logic [width-1:0] mask [num]
[width-1:0] mask
是宽度位的向量。如果宽度为 8,这将是一个 8 位向量:[7:0] mask
.
向量后跟[num]表示它是'num'个向量的数组。总数是一个宽度 x num 位的二维数组。
这种语法很常见,你会经常看到它。
我不得不寻找 '{4,4} 模式(我在我的 System Verilog 小册子中找不到它),正如 Matthew 所说,它是对数组的赋值。所以,我最初的解释是错误的。
现有代码的问题是我的 Verilog 模拟器在使用默认值时会抛出一条错误消息。 num 是 4 并且 '{4,4} 只有两个元素。这在启动时出现错误:
ERROR: [VRFC 10-666] expression has 2 elements; expected 4 [...
如果我将 num 设置为 2 #(.num(2))
模拟器会很高兴。
A module 就像一个 VHDL entity,所以我们有一个块叫做 works
:
module works
一个参数就像一个VHDL通用。在 SystemVerilog 中,我们不说 generic
,而是说 #
。因此,我们有一个包含三个参数(泛型)的块,一个 int
(32 位有符号整数,如 VHDL 整数),默认值为 4:
#(parameter int num = 4,
默认值为 8 的 int
:
parameter int width = 8,
和一个大小等于参数值num
的int
数组,编号为0到num-1
:
parameter int bits [num] = '{4, 4})
'{4,4}
是一个 分配模式 并且是 VHDL 聚合 的(粗略)等价物。因此,此代码试图将此数组的两个值初始化为整数 4。问题是 此代码可能是非法的。数组 bits
可以是任意大小(取决于参数 num
的值),这个数组就是所谓的 未压缩数组 。在 SystemVerilog(和 Verilog)中,打包数组赋值的大小和形状都必须匹配(就像在 VHDL 中一样)。除非 num
的值为 2,否则此赋值任一侧的大小将不匹配。如果要将解压缩数组的所有元素初始化为相同的东西,可以使用 key (很像 VHDL others
):
parameter int bits [num] = '{default:4})
https://www.edaplayground.com/x/5w8y
这是一个端口:
(output logic [width-1:0] mask [num]);
其大小由width
和num
两个参数定义。输出是 num
(所谓的 unpacked 维度)的数组,宽度为 width
(所谓的 packed维度)。 logic
是一种类型。 logic
类型的变量可以取四个值之一:0、1、X 或 Z。
我无法理解这段代码的含义。
我知道 VHDL 并且需要系统 verilog。我不知道bits [num] = '{4, 4})
或(output logic [width-1:0] mask [num]);
请解释一下
module works
#(parameter int num = 4,
parameter int width = 8,
parameter int bits [num] = '{4, 4})
(output logic [width-1:0] mask [num]);
output logic [width-1:0] mask [num]
[width-1:0] mask
是宽度位的向量。如果宽度为 8,这将是一个 8 位向量:[7:0] mask
.
向量后跟[num]表示它是'num'个向量的数组。总数是一个宽度 x num 位的二维数组。 这种语法很常见,你会经常看到它。
我不得不寻找 '{4,4} 模式(我在我的 System Verilog 小册子中找不到它),正如 Matthew 所说,它是对数组的赋值。所以,我最初的解释是错误的。
现有代码的问题是我的 Verilog 模拟器在使用默认值时会抛出一条错误消息。 num 是 4 并且 '{4,4} 只有两个元素。这在启动时出现错误:
ERROR: [VRFC 10-666] expression has 2 elements; expected 4 [...
如果我将 num 设置为 2 #(.num(2))
模拟器会很高兴。
A module 就像一个 VHDL entity,所以我们有一个块叫做 works
:
module works
一个参数就像一个VHDL通用。在 SystemVerilog 中,我们不说 generic
,而是说 #
。因此,我们有一个包含三个参数(泛型)的块,一个 int
(32 位有符号整数,如 VHDL 整数),默认值为 4:
#(parameter int num = 4,
默认值为 8 的 int
:
parameter int width = 8,
和一个大小等于参数值num
的int
数组,编号为0到num-1
:
parameter int bits [num] = '{4, 4})
'{4,4}
是一个 分配模式 并且是 VHDL 聚合 的(粗略)等价物。因此,此代码试图将此数组的两个值初始化为整数 4。问题是 此代码可能是非法的。数组 bits
可以是任意大小(取决于参数 num
的值),这个数组就是所谓的 未压缩数组 。在 SystemVerilog(和 Verilog)中,打包数组赋值的大小和形状都必须匹配(就像在 VHDL 中一样)。除非 num
的值为 2,否则此赋值任一侧的大小将不匹配。如果要将解压缩数组的所有元素初始化为相同的东西,可以使用 key (很像 VHDL others
):
parameter int bits [num] = '{default:4})
https://www.edaplayground.com/x/5w8y
这是一个端口:
(output logic [width-1:0] mask [num]);
其大小由width
和num
两个参数定义。输出是 num
(所谓的 unpacked 维度)的数组,宽度为 width
(所谓的 packed维度)。 logic
是一种类型。 logic
类型的变量可以取四个值之一:0、1、X 或 Z。