2017-10-04 115 views
0

我是新來的系統Verilog和UVM,我已經看到了這個線程:在迫使多條電線在SV設計/ UVM

Regex in SV or UVM

我找不到任何地方一個適當的例子使用正則表達式/通配符,我應該使用什麼樣的語法來強制設計多個連線。

例如:

比方說,我有一個名爲my_fifo模塊,這是在設計中多次實例化:

top.dut.my_fifo_in 
top.dut.master.my_fifo_a 
top.dut.slave.axi.my_fifo_out 

並且塊my_fifo含有一種叫線:

wire force_me_to_1 = 1'b0; 

我想在所有以「my_fifo」開頭的實例中強制使用此線。 喜歡的東西(請原諒我的語法,這只是爲了澄清我的意圖):

force "*my_fifo*.force_me_to_1" = 1'b1; 

,它會作出這樣的線1在上述所有情況。

+0

從語言外部的模塊外部無法做到。 – Serge

+0

我同意。我想知道'uvm_hdl_force'是否可能採用通配符,但看起來不像它。 –

+0

謝謝你們的答案。 模塊外部是什麼意思?你的意思是它不能作爲DUT接口的一部分嗎? 如何使用賦值而不是強制? 最後 - 你會建議做什麼呢? – EEliaz

回答

3

有兩種方法可以實現您想要執行的操作:使用VPI或使用工具的命令行界面。

這兩種方法都涉及編寫一個算法,該算法遍歷整個設計中的所有實例並選擇與正則表達式匹配的名稱。一旦你有了一個選定的實例,你可以用C中的VPI調用或工具命令(通常爲Tcl)應用單獨的強制命令。在這個論壇上解釋如何做到這一點太廣泛了。

這兩種方法都要求您關閉某些優化工具,以保留您要強制的信號名稱。這可能是一個嚴重的性能損失。所以你應該研究你的方法的替代方案。

1

沒有直接的方法來做你想做的事,但是有一些技巧你可以在你的案例中探索。

據說,在頂部實例某處你定義了一個標誌,說force_me

module tb_top; 
    bit force_me = 0; 
    ... 
endmodule 

你的模塊中,你可以寫類似的流動:在您的測試平臺

module my_fifo; 

    logic force_me_to_1; 

    always @(tb_top.force_me) begin 
     if (tb_top.force_me) 
      force force_me_to_1 = 1; 
     else 
      release force_me_to_1; 
    end 
    .. 
endmodule 

現在你應該可以說

tb_top.force_me = 1; 
... 
tb_top.force_me = 0; 

這應該強制在模塊'my_fifo'的所有實例中(來自模塊內部:-))的信號。

+0

謝謝你的答案。 我會嘗試做一個測試用例,但也許你可以更快地回答如果「tb_top.force_me」位不被定義會發生什麼? – EEliaz

+0

@EEliaz它你沒有定義它,該計劃將無法正常工作。你將會有未定義的變量。我不確定,但verilog可能會嘗試在這種情況下自動爲您定義一個一位變量,請參閱'default_nettype指令。但這將是一個不好的做法。 – Serge