2015-09-15 58 views
0

案例#1:如何使用通配符字符串SystemVerilog中case語句

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語句中是否有可能使用通配符搜索命中?

回答

1

我發現了一個變通辦法:

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上找到這個解決方案。 現在找不到鏈接。將盡快發佈參考。

1

SystemVerilog沒有內置到標準中的任何字符串正則表達式匹配方法。 UVM有一個包含uvm_re_match()函數的包。即使您不使用任何其他UVM測試臺功能,也可以導入UVM軟件包以訪問此功能。一些模擬器,如的ModelSim /奎斯塔有這些程序內置的一個擴展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 
+0

我有一個OVM工作臺和IUS模擬器。不幸的是,我在OVM中看不到uvm_re_match()等價物。我不確定是否可以爲此僅導入UVM包。 –

+0

@SiddharthLal您不必導入整個UVM包。您可以調用'uvm_pkg :: uvm_re_match(...)'。 –

相關問題