在我的模块中,我有一个名为'reg'类型的CMD的输出端口。
module ddesign (clk, rst, addr, data, Cmd);
input clk;
input rst;
input [31:0] addr;
input [31:0] data;
...
output reg [2:0] Cmd; // this is the signal concerned
...
always @(posedge clk) begin
if (rst == 0) begin
Cmd = IDLE; // I wanted to drive enum values
end
else begin
Cmd = WR;
...
end
end
endmodule;
我还使用typedef定义了信号CMD,如下一个文件中所示。
typedef enum logic [2:0] {
IDLE,
WR,
RD,
RDX,
RDL,
WRN,
WRC,
BROADCAST
} Cmd_t;
界面定义为
Interface intf (input clk);
Cmd_t Cmd;
...
endinterface
在我实例化模块的顶部文件中,
module top;
...
intf vif(clk); // interface instantiation
ddesign dut(
...
.Cmd(vif.Cmd), // the module port and interface are connected like this, but here is the incompatibility problem
...
);
endmodule
所以我会收到以下错误:
**错误:( VSIM-3906)f:/folder1/project1/dv/top/top.sv(79):连接类型'file_listrongvh_unit.enum reg [2:0]':0]'对于端口(CMD)。
如何解决此错误,只要我可以在设计模块中的CMD信号上驱动枚举类型值?
由于 Cmd
是设计的输出端口,因此您正在尝试从变量中进行分配,该变量不是enum
到另一个是enum
的变量。没有演员,这是不合法的。Systemverilog无法指定分配的目标(或LVALUE)。
因此,您需要做两件事之一:
- 使用CMD_T类型声明您的CMD端口
- 将您的CMD端口连接到接口中的兼容变量类型,并使用连续的分配将其施放到CMD_T类型。
通常,如果不铸造,将enum
分配给不同一类型的价值是不合法的。但是,通过指定枚举的位范围可以解决。它可以使用我尝试的模拟器。我不确定这种解决方法是模拟器还是LRM本身的意图或意外功能。
ddesign dut(
.Cmd(vif.Cmd[2:0]),
.* );