调试帮助:Enum Reg与Reg端口不兼容



在我的模块中,我有一个名为'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]), 
  .* );

最新更新