再看Byte Write Enable
- 2019 年 10 月 30 日
- 筆記
思考空間
給定列表{RAMB18 RAMB36 LUTRAM RAMB},要求從中找出RAMB18和RAMB36。
如下圖所示。

單埠RAM支援BWE(Byte Write Enable),同樣地,雙埠RAM也支援BWE。結合RAM的三種工作模式(讀優先、寫優先和保持模式,關於三種工作模式可看這裡write_first/read_first/no_change什麼區別)可形成不同的組合。例如:雙埠RAM讀優先,雙埠RAM寫優先。這裡我們看一個支援BWE功能的真雙埠讀優先RAM,通過這個案例了解一下SystemVerilog的幾個知識點。
先看程式碼的第一部分,如下圖所示。從埠聲明部分不難看出,該RAM有兩個獨立的埠:埠A和埠B。之所以認為兩者獨立是因為它們有各自的時鐘埠、數據埠、地址埠和BWE埠。程式碼第22行聲明了一個數組,數組的深度為DEPTH,這種寫法類似於C語言聲明數組的方法,這種方法僅在SystemVerilog中可用,Verilog並不支援。同時,在該行使用了ram_style的綜合屬性。該屬性用於指導Vivado將該RAM採用何種資源實現,可用的值包括block、distributed、registers和ultra(ram_style的具體使用方法可以看這裡Vivado綜合屬性:RAM_STYLE和ROM_STYLE)。這裡我們將其值設置為block,那麼Vivado會將其採用Block RAM實現。

程式碼的第二部分如下圖所示。核心部分是兩個for generate語句。兩個for generate語句描述的功能是一致的,只是一個針對A埠,一個針對B埠。需要注意的是genvar也就是循環變數不能是同一個變數,在這裡分別為i和k。不同於之前單埠BWE的描述方式,這裡使用了符號「+:」,該符號的左邊為基地址,右邊為位寬,從而確定哪些bit被選中。除了「+:」還有「-:」,兩者被稱為indexed part-select。

關於indexed part-select,我們再來看一個具體案例,如下圖所示。

思考空間
如果b_vect採用如下聲明方式:
logic [0 : 31] b_vect;
那麼b_vect[0 +: 8]和b_vect[15 -:8]分別選取b_vect的哪些位?