通过 TLM 端口将浮点数从 SystemVerilog 传输到 SystemC



我在C/C++中实现了特定的过滤器,"封装"在SystemC模块中。我想在我的实际验证环境 (VE( 中使用此过滤器,该环境基于 SystemVerilog。为了将数据传入和传输到过滤器,我想实现TLM连接。对于TLM,有一种叫做"通用有效载荷"的东西,基本上定义了可以通过TLM传输的内容,TLM是一个字节数组。

因此,我需要将 VE 中的数据样本从数据类型 real 转换为字节数组。我试图做的是创建一个联合类型,这样我就可以存储一个实值并读取一个字节数组。

typedef union packed {
real value;
byte unsigned array[8];
} real_u;

但是,我收到以下错误消息。

real value;
|
ncvlog: *E,SVBPSE (Initiator.sv,7|11): The data type of a packed struct/union     member must be a SystemVerilog integral type.
byte unsigned array[8];
|
ncvlog: *E,SVBPSE (Initiator.sv,8|20): The data type of a packed struct/union member must be a SystemVerilog integral type.

我该如何解决这个问题?有没有其他方便的方法可以在 SV/C++ 中将浮点数转换为字节数组?

packed联合和结构可能只包含packed成员。因此,在您的情况下,realbyte unsigned array[8]都是解压缩的。您可能可以使用unpacked联合来执行此操作,但并非每个供应商都实现这些联合。

此外,标准中未定义"real"的字节大小,因此,您的联合很可能根本不起作用。但是,系统验证提供了一组函数来将实际变量转换为某些大小的变量。在您的情况下,返回 64 位的$realtobits可能会起作用。

因此,我建议您在转换为位后传递实际值:

bit[63:0] realBits = $realtobits(value);

最新更新