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

Transmitting floating-point numbers over a TLM port from SystemVerilog to SystemC

我在 C/C++ 中实现了一个特定的过滤器,"encapsulated" 在 SystemC 模块中。我想在我基于 SystemVerilog 的实际验证环境 (VE) 中使用此过滤器。为了在过滤器之间传输数据,我想实现一个 TLM 连接。对于 TLM,有一个叫做 "generic payload" 的东西,基本上定义了可以通过 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' 的字节大小未在标准中定义,因此,您的联合很可能根本无法工作。但是,system verilog 提供了一组函数来将实数转换为特定大小的变量。在您的情况下,$realtobits returns 64 位可能会起作用。

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

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