【问题标题】:UVM - Error - :near "(": syntax error, unexpected '(', expecting IDENTIFIER or '='UVM - 错误 - :near "(": 语法错误,意外 '(',期待 IDENTIFIER 或 '='
【发布时间】:2016-12-14 14:10:28
【问题描述】:

我创建自己的宏文件:

`ifndef MY_MACROS_SV
`define MY_MACROS_SV

// MACRO: 'my_fatal_err
// calls uvm_fatal in case the assertion is not correct
`define my_fatal(condition, msg)\
   assert (condition) else\
`uvm_fatal("FATAL ERROR", msg)

`define add_rand(mem_type, mem) \
  begin \
   case (mem_type) \
     "int": add_rand_int(mem); \
     "bit": add_rand_bit(mem); \
     default: `uvm_fatal("FATAL ERROR", "type is not supported") \
    endcase\
  end

`endif  //MY_MACROS_SV

我收到以下错误:

** at ..\sv\tx_transaction.sv(21): near "(": 语法错误,意外的 '(',需要 IDENTIFIER 或 '='。

tx_transaction.sv 中的第 21 行:

  add_rand_macro();

add_rand 是定义在 base_transaction 中的函数(tx_transaction 扩展它):

class base_transaction extends uvm_sequence_item();

   int rand_int_list [];   
   bit rand_bit_list [];


   bit [31:0] data [$];

   //add to list functions
   function void add_rand_int(int mem);
      rand_int_list.push_back(mem);      
   endfunction: add_rand_int
   ......
endclass: base_transaction

tx_transaction 的代码:

class tx_transaction extends base_transaction;
   bit [15:0]  data_xi;
   bit [15:0]  data_xq;
   int mem_int;  //TODO- delete

   //uvm_object_utils\
   `uvm_object_utils(tx_transaction)

   //constructor
   function new(string name = "tx_transaction");
      super.new(name);
   endfunction: new

   function void add_rand_macro();
      `add_rand("int", mem_int)
   endfunction: add_rand_macro

   add_rand_macro();

   //TODO - DELETE
   function void foo();
      $display("rand mem int: %d", mem_int);
   endfunction: foo

endclass: tx_transaction

【问题讨论】:

    标签: macros system-verilog uvm


    【解决方案1】:

    由于宏扩展为case 语句,因此必须从类中的函数内部调用它:

    function ...
    
        ...
       `add_rand("int", mem_int)   
        ...
    
    endfunction
    

    更新:确保使用分号结束 function 语句:

    function void add_rand_macro();
        `add_rand("int", mem_int)
    endfunction
    

    更新:您不能在类的主体中调用add_rand_macro 函数;它必须在另一个函数中调用。

    【讨论】:

    • @toolic- 我将其更改为:
      function void add_rand_macro() `add_rand("int", mem_int) endfunction: add_rand_macro  并得到以下错误:** 解析宏时扩展:'add_rand' 开始于 ..\sv\tx_transaction.sv(18) ** at ..\sv\tx_transaction.sv(18):靠近“开始”:语法错误,意外开始,期待 ';'。
                      
                    
                      
                              
                  
    • @toolic- 我写的。 Jusr 忘记更新问题了。错误仍然存​​在。
    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2019-12-06
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-02-25
    相关资源
    最近更新 更多