如何將字符串的動態數組格式(或更正確地說,邏輯)格式化爲例如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中的一個錯誤。
由於左對齊的結果右移。我曾考慮過用循環來做這件事(我通常會寫VHDL,所以我習慣以暴力方式來做事情)。我認爲它需要一點改進來支持不是4的倍數的大小,否則它應該適用於幾乎任何大小的數組。流式傳輸到一個壓縮數組(像我這樣做)仍然會對大小設置一個上限。感謝您在另一個模擬器上嘗試代碼。在Questa 10.3d上將其轉換爲固定大小「有效」,但它與我提到的左對齊問題相同。 – Jabberwock
我玩過它的非倍數爲4,並且在將'i> 0'改爲'i> = 0'後,它仍然在[edaplayground](http://www.edaplayground.com/)上與模擬器正確投射。例如:'vdyn = new [17]' – Greg