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

UVM sequence body task gives unknown compilation error

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

 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;
...
...
...

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

typedef class my_transaction ;

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

我正在将此文件与其他文件一起编译。编译器错误消息是否具有误导性?我可以查找代码中的哪些其他位置来了解问题的根源?

可能是什么问题?

uvm_sequenceclass声明的源代码是:

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

REQ 是一个 类型参数 。您将它用于其他用途是 wrong/confusing 您的编译器。