问题描述
我有以下代码块,其中触发了语法错误:
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参数。您将其用于其他用途是错误的/使您的编译器感到困惑。