2016-07-20 77 views
2

如何將字符串的動態數組格式(或更正確地說,邏輯)格式化爲例如UVM的convert2string?例如,我想將在SystemVerilog中將字符串的動態數組格式設置爲字符串

logic  vdyn[]; 
... 
vdyn = new [16] ('{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1}); 

改爲字符串0097

我想下面將工作(的#只是劃定了可讀性字符串):

fmt = $sformatf("#%%%0dh#", (vdyn.size-1)/4 + 1); // "#%4h#" 
    vstr = $sformatf(fmt, { >> {vdyn}}); 

但它返回# x#,至少在奎斯塔10.3d(我懷疑這是一個錯誤 - 我如果它在其他模擬器上工作,那麼它會感興趣)。

我試着先將它轉換成壓縮數組,但是會遇到其他問題。如果沒有對結果有大小限制,源值總是被左對齊的目標變量,例如:

logic [63:0] v64; 
... 
v64 = {>> {vdyn}}; // 64'h0097000000000000 

有沒有辦法打印出來只是我不想使用可變大小的切片部分。下面的作品,但它要求我知道在編譯時數組的大小:

v64 = 16'({>> {vdyn}}); // 64'h0000000000000097 

我發現的最好的事情是下面的「雙反」(請注意,我用<<這裏,不>>):

 v64 = {<< {vdyn}}; // 64'he900000000000000 
    v64 = {<< {v64}};  // 64'h0000000000000097 
    vstr = $sformatf(fmt, v64); // #0097# 

這似乎有點做作不得不這樣做,雖然。順便說一句,前兩個語句組合成一個不工作:

 v64 = {<< {{<< {vdyn}}}};  // 64'hZ900000000000000 

v64[63]z出於某種原因)。再次,我懷疑這是Questa 10.3d中的一個錯誤。

回答

1

嘗試投射數組的一部分並循環遍歷。例如,一個轉換爲4位值的4條目片段。甲slize可以與-:+:操作者來完成(參見IEEE Std 1800-2012 § 7.4.3 上陣列操作和§ 7.4.6 索引和陣列的切片)中的代碼

vstr = ""; 
for(int i=vdyn.size()-1; i>=0; i-=4) begin 
    vstr = $sformatf("%h%s", 4'({>>{vdyn[i -: 4]}}), vstr); 
end 
vstr = $sformatf("#%s#", vstr); // user formatting 

4 S可改成別的東西取決於有多少領導0或非冪的兩個格式是需要的,但它必須是一個數字常量


餘噸在其他模擬器上使用你的代碼。 vstr = $sformatf(fmt, { >> {vdyn}});有時會給我編譯錯誤。鑄造數組的東西比其預期的最大尺寸更大,似乎工作

fmt = $sformatf("#%%%0dh#", (vdyn.size-1)/4 + 1); // "#%4h#" 
vstr = $sformatf(fmt, 128'({ >> {vdyn}})); // works iff 128>=vdyn.size 
+0

由於左對齊的結果右移。我曾考慮過用循環來做這件事(我通常會寫VHDL,所以我習慣以暴力方式來做事情)。我認爲它需要一點改進來支持不是4的倍數的大小,否則它應該適用於幾乎任何大小的數組。流式傳輸到一個壓縮數組(像我這樣做)仍然會對大小設置一個上限。感謝您在另一個模擬器上嘗試代碼。在Questa 10.3d上將其轉換爲固定大小「有效」,但它與我提到的左對齊問題相同。 – Jabberwock

+0

我玩過它的非倍數爲4,並且在將'i> 0'改爲'i> = 0'後,它仍然在[edaplayground](http://www.edaplayground.com/)上與模擬器正確投射。例如:'vdyn = new [17]' – Greg

1

我認爲這個問題可能是使用動態類型的流媒體運營商的寬度不以自我決定的背景下定義(如參數到系統任務)。我認爲LRM應該對待這個錯誤。

一個解決辦法是通過

v64 = {>> {vdyn}}; 
v64 >>= 64-vdyn.size; 
+0

(a)寬度應該是明確的,儘管顯然不是靜態的(如果這就是您自定義的意思)。 (b)改變理由的方式有點兒更好,但是真的沒有辦法直接將一個動態數組轉換爲等價(右對齊)的打包數組嗎?對我來說,這似乎是一個明顯的語言功能。 (c)在這裏的評論中是否有添加換行符的方法?我只注意到,一切都合在一起。 – Jabberwock

+1

是的。我應該說_不是靜態定義的。 Verilog要求靜態確定所有整型的寬度。 –