UVM序列主体任务给出未知的编译错误

问题描述

我有以下代码块,其中触发了语法错误:

 virtual task body();
     forever begin
    my_transaction m_req;
    // Blocking wait for a transaction request:
    p_sequencer.m_request_fifo.get(m_req);
    // Generate response based on "req_kind" value:
    if ( m_req.req_kind == REQ ) begin
       `uvm_do_with(req,{req_kind == REQ;} )
    end
    else begin
       `uvm_do_with(req,{req_kind == NO_REQ;} )       
    end
     end
  endtask

我收到以下错误消息:

Error-[SE] Syntax error
  Following verilog source has syntax error :
  "./src/my_transaction.sv",77: token is ')'
    if ( m_req.req_kind == REQ ) begin
                                      ^

如果我对if和else行进行如下注释,则此代码块将正常编译:

  virtual task body();
     forever begin
    my_transaction m_req;
    // Blocking wait for a transaction request:
    p_sequencer.m_request_fifo.get(m_req);
    // Generate response based on "req_kind" value:
    //if ( m_req.req_kind == REQ ) begin
       `uvm_do_with(req,{req_kind == REQ;} )
    //end
    //else begin
       `uvm_do_with(req,{req_kind == NO_REQ;} )       
    //end
     end
  endtask

我尝试评论此行:

my_transaction m_req;

也是如此,并且由于未定义的m_req标识符而可能会引发错误。但是代码实际上可以编译!

req_kind的定义是:

class my_transaction extends uvm_sequence_item;
   typedef enum {REQ,NO_REQ} req_kind_e;
   rand req_kind_e req_kind;
...
...
...

并且类my_transaction 在存在编译错误的文件中类型转发:

typedef class my_transaction ;

有问题的代码块是序列库中的序列,其中m_request_fifo是从序列器中用于检索序列的端口。

我正在将此文件与其他文件一起编译。编译器错误消息是否令人误解?我可以在代码中寻找其他哪些地方来了解问题的根源?

可能是什么问题?

解决方法

uvm_sequence类的声明的源代码为:

virtual class uvm_sequence #(
    type    REQ  =  uvm_sequence_item,type    RSP  =  REQ
) extends uvm_sequence_base

REQ type参数。您将其用于其他用途是错误的/使您的编译器感到困惑。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...