Как использовать подстановочную строку в операторе case systemverilog

Дело 1:

module try;
  string inp = "my_var";

  initial begin
    $display("Here we go!");
    case (inp) 
    "my_var" : $display("my_var");
    default : $display("default");
    endcase
  end
endmodule

Выход my_var

Дело №2

module try;
  string inp = "my_var";

  initial begin
    $display("Here we go!");
    case (inp) 
    "*var*" : $display("*var*");
    default : $display("default");
    endcase
  end
endmodule

Выход default.

Можно ли получить результат с поиском подстановочных знаков в операторе case?


person Siddharth Lal    schedule 15.09.2015    source источник


Ответы (2)


SystemVerilog не имеет встроенных в стандарт методов сопоставления строковых регулярных выражений. В UVM есть пакет с функцией uvm_re_match(). Вы можете импортировать пакет UVM, чтобы получить доступ к этой функции, даже если вы не используете какие-либо другие функции тестового стенда UVM. В некоторых симуляторах, таких как ModelSim/Questa, эти подпрограммы встроены как расширение SystemVerilog, так что вы можете

module try;
  string inp = "my_var";

  initial begin
    $display("Here we go!");
    case (1) 
      inp.match("*var*") : $display("*var*");
      default            : $display("default");
    endcase
  end
endmodule
person dave_59    schedule 15.09.2015
comment
У меня есть стенд OVM и симулятор IUS. К сожалению, я не вижу эквивалента uvm_re_match() в OVM. Я не уверен, что будет нормально импортировать пакет UVM только для этого. - person Siddharth Lal; 16.09.2015
comment
@SiddharthLal Вам не нужно импортировать весь пакет UVM. Вы можете просто позвонить uvm_pkg::uvm_re_match(...). - person Tudor Timi; 16.09.2015

Я нашел обходной путь:

function string match(string s1,s2); 
int l1,l2; 
l1 = s1.len(); 
l2 = s2.len(); 
match = 0 ; 
if( l2 > l1 ) 
return 0; 
for(int i = 0;i < l1 - l2 + 1; i ++) 
if( s1.substr(i,i+l2 -1) == s2) 
return s2; 
endfunction 

module try;
  string target_id = "abc.def.ddr4_0";
  string inp     = "ddr4_0";
  string processed_inp;

  initial begin
    $display("Here we go!");
    for(int i=0;i<2;i++) begin
      if (i == 1)begin
        inp     = "ddr4_1";
        target_id = "abc.def.ddr4_1";
      end
      processed_inp = match(target_id, inp);
      $display("input to case = %0s", processed_inp);
      case (processed_inp) 
      "ddr4_0"   : $display("ddr4_0 captured!");
      "ddr4_1"   : $display("ddr4_1 captured!");
      default : $display("default");
      endcase
    end
  end
endmodule

Выход:

Here we go!
input to case = ddr4_0
ddr4_0 captured!
input to case = ddr4_1
ddr4_1 captured!

PS: нашел это решение на сайте www. Ссылку сейчас не могу найти. Ссылку скоро выложу.

person Siddharth Lal    schedule 29.09.2015