#syntax-error #verilog #system-verilog #uvm
#синтаксическая ошибка #verilog #system-verilog #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
является портом, используемым в подчиненном секвенсоре для извлечения последовательности.
Я компилирую этот файл вместе с другими файлами. Вводит ли сообщение об ошибке компилятора в заблуждение? Какие еще места в коде я могу поискать, чтобы узнать источник проблемы?
В чем может быть проблема?
Ответ №1:
Исходный код для объявления uvm_sequence
класса является:
virtual class uvm_sequence #(
type REQ = uvm_sequence_item,
type RSP = REQ
) extends uvm_sequence_base
REQ
является параметром типа. Вы используете ее для чего-то другого неправильно / сбиваете с толку ваш компилятор.
Комментарии:
1. Большое вам спасибо! Я использовал
REQ
и не знал, что это определение уже зарезервировано UVM. Я изменил ее наREQUEST
иNO_REQUEST
, и теперь она компилируется.