在我的模块中,我有一个名为Cmd的输出端口,它是'reg'类型。
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
所以我收到以下错误:
如果我可以在设计模块中的Cmd信号上驱动枚举类型值,如何解决此错误?
答案 0 :(得分:1)
由于Cmd
是您设计的输出端口,因此您尝试从不是enum
的变量到另一个enum
变量进行分配。没有演员,这是不合法的。并且SystemVerilog无法指定对赋值的目标(或左值)的强制转换。
所以你需要做两件事之一:
答案 1 :(得分:1)
通常,如果不进行强制转换,将enum
分配给值不同的类型是不合法的。但是,通过指定枚举上的位范围可以解决此问题。它适用于我尝试过的模拟器。我不确定这种解决方法是模拟器或LRM本身的预期或非预期功能。
ddesign dut(
.Cmd(vif.Cmd[2:0]),
.* );