如何随机化带符号的多维数组?
How do I randomize a signed multidimensional array?
我声明了一个带符号的多维数组如下:
typedef logic signed [3:0][31:0] hires_frame_t;
typedef hires_frame_t [3:0] hires_capture_t;
hires_capture_t rndpacket;
我想随机化这个数组,使每个元素的值在 -32768 到 32767 之间,以 32 位二进制补码表示。
我试过以下方法:
assert(std::randomize(rndpacket) with
{foreach (rndpacket[channel])
foreach (rndpacket[channel][subsample])
{rndpacket[channel][subsample] < signed'(32768);
rndpacket[channel][subsample] >= signed'(-32768);}});
这编译得很好,但是 (mentor graphics) modelsim 在模拟声明中失败
randomize() failed due to conflicts between the following constraints:
# clscummulativedata.sv(56): (rndpacket[3][3] < 32768);
# cummulativedata.sv(57): (rndpacket[3][3] >= 32'hffff8000);
这显然与有符号向量的使用有关。我觉得一切都应该没问题,因为数组被声明为 signed
以及 randomize
调用中的阈值,但显然不是。如果我将范围替换为 0-65535,一切都会按预期进行。
随机化这样一个有符号数组的正确方法是什么?
你的问题是 hires_frame_t
是一个带符号的 128 位二维 压缩 数组,select 压缩数组的一部分是 无符号。保持打包维度的部分 select 已签名的一种方法是对要签名的维度使用单独的 typedef
:
typedef bit signed [31:0] int32_t;
typedef int32_t [3:0] hires_frame_t;
typedef hires_frame_t [3:0] hires_capture_t;
另一种选择是将 signed
转换为比较的左轴。您在 RHS 上签名的演员没有做任何事情,因为裸十进制数字已经被视为签名。如果一侧或两侧无符号,则比较无符号。
assert(std::randomize(rndpacket) with {
foreach (rndpacket[channel,subsample])
{signed'(rndpacket[channel][subsample]) < 32768;
signed'(rndpacket[channel][subsample]) >= -32768;}});
顺便说一句,我正在展示使用二维 foreach
循环的 LRM 兼容方式。
我声明了一个带符号的多维数组如下:
typedef logic signed [3:0][31:0] hires_frame_t;
typedef hires_frame_t [3:0] hires_capture_t;
hires_capture_t rndpacket;
我想随机化这个数组,使每个元素的值在 -32768 到 32767 之间,以 32 位二进制补码表示。
我试过以下方法:
assert(std::randomize(rndpacket) with
{foreach (rndpacket[channel])
foreach (rndpacket[channel][subsample])
{rndpacket[channel][subsample] < signed'(32768);
rndpacket[channel][subsample] >= signed'(-32768);}});
这编译得很好,但是 (mentor graphics) modelsim 在模拟声明中失败
randomize() failed due to conflicts between the following constraints:
# clscummulativedata.sv(56): (rndpacket[3][3] < 32768);
# cummulativedata.sv(57): (rndpacket[3][3] >= 32'hffff8000);
这显然与有符号向量的使用有关。我觉得一切都应该没问题,因为数组被声明为 signed
以及 randomize
调用中的阈值,但显然不是。如果我将范围替换为 0-65535,一切都会按预期进行。
随机化这样一个有符号数组的正确方法是什么?
你的问题是 hires_frame_t
是一个带符号的 128 位二维 压缩 数组,select 压缩数组的一部分是 无符号。保持打包维度的部分 select 已签名的一种方法是对要签名的维度使用单独的 typedef
:
typedef bit signed [31:0] int32_t;
typedef int32_t [3:0] hires_frame_t;
typedef hires_frame_t [3:0] hires_capture_t;
另一种选择是将 signed
转换为比较的左轴。您在 RHS 上签名的演员没有做任何事情,因为裸十进制数字已经被视为签名。如果一侧或两侧无符号,则比较无符号。
assert(std::randomize(rndpacket) with {
foreach (rndpacket[channel,subsample])
{signed'(rndpacket[channel][subsample]) < 32768;
signed'(rndpacket[channel][subsample]) >= -32768;}});
顺便说一句,我正在展示使用二维 foreach
循环的 LRM 兼容方式。