调试帮助:enum reg与reg端口

时间:2016-12-06 07:02:32

标签: interface system-verilog

在我的模块中,我有一个名为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

所以我收到以下错误:

**错误:(vsim-3906)F:/folder1/project1/DV/top/top.sv(79):连接类型'file_list_svh_unit.enum reg [2:0]'与'reg [2不兼容:0]'用于端口(Cmd)。

如果我可以在设计模块中的Cmd信号上驱动枚举类型值,如何解决此错误?

2 个答案:

答案 0 :(得分:1)

由于Cmd是您设计的输出端口,因此您尝试从不是enum的变量到另一个enum变量进行分配。没有演员,这是不合法的。并且SystemVerilog无法指定对赋值的目标(或左值)的强制转换。

所以你需要做两件事之一:

  • 使用Cmd_t类型
  • 声明您的Cmd端口
  • 将您的Cmd端口连接到接口中的兼容变量类型,并使用连续分配将其强制转换为Cmd_t类型。

答案 1 :(得分:1)

通常,如果不进行强制转换,将enum分配给值不同的类型是不合法的。但是,通过指定枚举上的位范围可以解决此问题。它适用于我尝试过的模拟器。我不确定这种解决方法是模拟器或LRM本身的预期或非预期功能。

ddesign dut(
  .Cmd(vif.Cmd[2:0]), 
  .* );