如果移位暫存器這麼寫

  • 2019 年 10 月 30 日
  • 筆記

有兩種程式碼風格可用來描述移位暫存器。第一種風格如圖1所示,第二種風格如圖2所示。相比而言,第一種風格易於參數化,且將移位深度設置為參數可實現設計復用。同時,這種風格還可方便地使用綜合屬性SRL_STYLE,從而達到控制綜合結果的目的。第二種風格是無法使用SRL_STYLE的。SRL_STYLE的具體使用方法可參考這裡Vivado綜合屬性:SRL_STYLE

圖1
圖2

圖1和圖2所示程式碼移位深度為6,以此程式碼為例,在綜合設置選項為默認值的情形下(-shreg_min_size為3),綜合後的電路形式為FF->SRL->FF,如圖3所示。

圖3

從時序收斂的角度而言,圖3所示的電路是易於達到收斂的目的的,但在實踐中,我們發現,有時第一級的觸發器與後續的SRL距離較遠,導致布線延遲太大。一個可能的解決方法是能否從該SRL中「拽出」一個觸發器,也就是將SRL變為FF+SRL,此時的SRL深度為原始SRL深度減1。這時可利用屬性SRL_STAGES_TO_REG_INPUT。具體使用方法如圖4所示。這裡get_cells命令的對象為圖3中的SRL。

圖4

該屬性在opt_design階段生效,因此如果其作為約束,相應的約束文件應作為Hook Script顯示在tcl.pre里,如圖5所示。

圖5

最終布局布線後的電路就變為如圖6所示情形。

圖6

此外,如果希望從SRL中「拽出」一個觸發器與最後一級觸發器相連,可利用屬性SRL_STAGES_TO_REG_OUTPUT。

結論

SRL_STAGES_TO_REG_INPUT可從SRL中向其輸入方向「拽出」一個觸發器

SRL_STAGES_TO_REG_OUTPUT可從SRL中向其輸出方向「拽出」一個觸發器