当我试图在UVM环境中将VHDL中的多维用户定义类型连接到SystemVerilog时,我在Cadence工具链模拟中遇到了这个问题。这是VHDL输出类型定义:
TYPE loop_reg_ty IS RECORD
loop_index_value : std_logic_vector(REG_BITWIDTH-1 DOWNTO 0);
loop_counter : std_logic_vector(REG_BITWIDTH-1 DOWNTO 0);
loop_end_flag : std_logic;
END RECORD;
TYPE loop_array_ty is array (MAX_NO_OF_LOOPS-1 downto 0) of loop_reg_ty;
在我的loop_array_ty
输出端口之一是类型为;
我试图将SystemVerilog等效定义为:
typedef struct packed {
bit [REG_BITWIDTH-1:0] loop_index_value;
bit [REG_BITWIDTH-1:0] loop_counter;
bit loop_end_flag;
} raccu_loop_reg_ty;
typedef raccu_loop_reg_ty [MAX_NO_OF_RACCU_LOOPS-1:0] loop_array_ty;
当我使用irun
时,我得到了错误:
VHDL端口类型与Verilog不兼容。
请建议解决方案的可能工作。
发布于 2014-12-05 19:33:57
首先,您的问题是没有正确定义loop_array_ty
。应该是typedef raccu_loop_reg_ty loop_array_ty[MAX_NO_OF_RACCU_LOOPS-1:0]
。
我在这里建议两件事:
首先,尝试从packed
定义中删除struct
限定符。将SV结构连接到VHDL记录是只在更新的精辟版本中可用的东西。确保您所使用的版本支持此功能。
如果您使用的是更早版本的“敏锐”(就像我一年前那样),您唯一的选择是使用$nc_mirror
映射单个记录成员(不是经过测试的代码,而是足以让您开始工作):
// struct definition...
// ...
module top;
// intermediate signal we'll mirror onto
loop_array_ty loop_s;
// no output connected
my_dut dut_inst();
// make the connection between SV and VHDL using nc_mirror
initial begin
for (int i = 0; i < MAX_NO_OF_RACCU_LOOPS; i++) begin
$nc_mirror($sformatf("loop_s[%0d].loop_index_value", i),
$sformatf("dut_inst.loop_o[%0d].loop_index_value", i);
// $nc_mirror for loop_counter
// $nc_mirror for loop_end_flag
end
end
endmodule
还要确保在这两种语言中都适当地设置了REG_BITWIDTH
常量,否则也会出现类型不匹配。
https://stackoverflow.com/questions/27318813
复制相似问题