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

时间:2018-10-08 12:58:03

标签: system-verilog systemc

我用C / C ++实现了一个特定的过滤器,“封装”在SystemC-Module中。我想在基于SystemVerilog的实际验证环境(VE)中使用此筛选器。为了与过滤器之间来回传输数据,我想实现一个TLM连接。对于TLM,有一种称为“通用有效载荷”的东西,基本上定义了可以通过TLM传输的内容,它是一个字节数组。

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

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 ++中还有其他简便的方法可以将浮点数转换为字节数组吗?

1 个答案:

答案 0 :(得分:1)

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

此外,标准中未定义“真实”的字节大小,因此,您的并集很可能根本无法工作。但是,系统Verilog提供了一组将实数转换为某些大小的变量的函数。对于您来说,返回64位的$realtobits可能会起作用。

所以,我建议您在转换为位后才传递实值:

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