Основная задача последовательности UVM выдает неизвестную ошибку компиляции

#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 , и теперь она компилируется.