如果你有一个长符号数组,你能用电线把它拆开吗?
if you have a long signed array, can you break it up using wires?
为简单起见,假设我的模块有一个 50 位输入。这个 50 位输入被分成十个 5 位有符号字。这是使输入的每个部分都签名的方式吗?
module(in, out)
input signed [49:0] in;
wire signed [4:0] in_temp [0:9];
genvar i;
for(i = 0; i < 128; i = i+1)
assign in_temp[i] = in[5*(i+1)-1 -: 5];
....
结果是有符号的还是无符号的都没有关系。一旦你分开一根电线,它就失去了意义。
例如:如果将带符号的 8'b00011111 分成两个相等的部分,您将得到 4'b0001 和 4'b1111。这 4 个位数中的每一个的 'value' 是多少?
只有当您稍后以正确的顺序再次连接它们时,您才能取回原始号码。
正在回答您的问题:
这并不重要,但我会让所有单独的部分都没有符号,因为除了一个之外的所有部分的最高位不再是符号位,因此类型可能会造成混淆。你可以学究气,制作一个有符号向量和九个无符号向量。
更有用的是使用像 in_split
这样的名称来指示这是已拆分的矢量的一部分。
这是一种方式。您还可以使用 $signed(in[5*(i+1)-1 -: 5])
投射每个切片,这样就不需要中间信号。
SystemVerilog 添加了另一个选项。您可以定义一个压缩数组,它是由 10 个带符号的 5 位向量组成的 50 位向量。
typedef logic signed [4:0] int5_t;
typedef int_5_t signed [9:0] int50_t;
module m(input int_50_t in, output out));
// can now use in[1] as a 5-bit signed signal which corresponds to bits [9:5] of the 50-bit vector
为简单起见,假设我的模块有一个 50 位输入。这个 50 位输入被分成十个 5 位有符号字。这是使输入的每个部分都签名的方式吗?
module(in, out)
input signed [49:0] in;
wire signed [4:0] in_temp [0:9];
genvar i;
for(i = 0; i < 128; i = i+1)
assign in_temp[i] = in[5*(i+1)-1 -: 5];
....
结果是有符号的还是无符号的都没有关系。一旦你分开一根电线,它就失去了意义。
例如:如果将带符号的 8'b00011111 分成两个相等的部分,您将得到 4'b0001 和 4'b1111。这 4 个位数中的每一个的 'value' 是多少? 只有当您稍后以正确的顺序再次连接它们时,您才能取回原始号码。
正在回答您的问题:
这并不重要,但我会让所有单独的部分都没有符号,因为除了一个之外的所有部分的最高位不再是符号位,因此类型可能会造成混淆。你可以学究气,制作一个有符号向量和九个无符号向量。
更有用的是使用像 in_split
这样的名称来指示这是已拆分的矢量的一部分。
这是一种方式。您还可以使用 $signed(in[5*(i+1)-1 -: 5])
投射每个切片,这样就不需要中间信号。
SystemVerilog 添加了另一个选项。您可以定义一个压缩数组,它是由 10 个带符号的 5 位向量组成的 50 位向量。
typedef logic signed [4:0] int5_t;
typedef int_5_t signed [9:0] int50_t;
module m(input int_50_t in, output out));
// can now use in[1] as a 5-bit signed signal which corresponds to bits [9:5] of the 50-bit vector