(原創) avm_m1_writedata[15:0] 與 avm_m1_writedata[31:0]配合avm_m1_byteenable = 4'b0011意義是否一樣? (SOC) (SOPC Builder) (DE2-70)
Abstract
開發mater ip時,我們可以自行定義data bus的寬度,也可以透過byteenable定義哪些byte有效,但這兩個方式意義是否相同呢?
Introduction
首先來談談為什麼會有這個需求?
因為Nios II CPU是32 bit,所以若一切ip也是32 bit,那天下太平,一切的一切,只因為在DE2/DE2-70的SDRAM的data bus是16 bit,雖然Avalon bus提供Dynamic Bus Sizing機制,儘管master與slave的data bus寬度不一樣,SOPC Builder會自動幫我們處理,無須我們操心,但Avalon Bus在Spec也講得很清楚,當32 bit master傳到16 bit slave時,需要2個clk傳輸。也就是說,若我們的ip的data bus是32 bit,寫入SDRAM需要2個clk才能完成。
因為DE2只有一顆SDRAM,所以也沒什麼好解決方法,但因為DE2-70有兩顆16 bit SDRAM後,狀況就不一樣了,也就是說,我們可以將兩顆SDRAM虛擬成一顆32 bit SDRAM,這樣32 bit寫入資料就僅需1個clk就可以完成!!
要達成32 bit資料在1個clk寫入SDRAM,利用硬體的concurrency,我們可以寫2個master,同時將32 bit資料的低16 bit寫入第1顆SDRAM,將高16 bit寫入第2顆SDRAM。
但這就出現兩種寫法:
1.master ip的data bus改成16 bit,也就是avm_m1_writedata[15:0]。
2.master ip的data bus一樣是32 bit,但更改avm_m1_byteenable,也就是avm_m1_writedata[31:0]配合avm_m1_byteenable = 4'b0011。
若以結果論,這兩個結果完全一樣,但問題就在,哪一個才是真的在1個clk將32 bit資料寫入SDRAM。
第1種寫法不用懷疑,master與slave都是16 bit,不會啟動Dynamic Bus Sizing機制,1個clk完成。
問題比較爭議的是第2種使用byteenable寫法,可能出現2種想法:
1.在master寫入Avalon bus前就啟動byteenable,所以master只有16 bit寫入bus,slave當然只要1個clk就夠了。
2.在master寫入Avalon bus前就啟動byteenable,所以master一樣32 bit寫入bus,只是byteenable為0的byte就寫入0而以,由於仍是32 bit,所以slave還是需要2個clk。
下圖是實際用SignalTap II觀察:
在master ip中實際的code如下:
assign avm_m1_writedata = {16'h0F0F, fifo_rdq1};
avm_m1_writedata的高16 bit,我故意填16'h0F0F,但在SignalTap中,可以發現avm_m1_writedata的高16bit都是0000,顯然byateenable奏效了,不過重點是:master寫入bus一樣是32 bit,且SDRAM的az_data讀取時,一樣需要兩個clk,也就是第二種想法,才是Avalon bus實際的運作。
Conclusion
由SignalTap II觀察得知,儘管結果一樣,avm_m1_writedata[15:0] 與 avm_m1_writedata[31:0]配合avm_m1_byteenable = 4'b0011在Avalon bus實際的運作,還是有些差異,要真的在1個clk將32 bit資料送進2顆SDRAM,還是得用avm_m1_writedata[15:0]配合兩個master才行,不能靠byteenable。
See Also
(原創) 如何以32 bit的方式存取SDRAM? (SOC) (Nios II) (SOPC Builder) (DE2-70)