TCAM 三態內容地址查找存儲器,CAM內容地址查找存儲器。區別在於TCAM多了一級掩碼功能,也就是說可以指定某幾位是dont care。匹配的時候0,1都行的意思。
廣泛應用於數據流處理領域,本文簡要介紹TCAM和CAM的邏輯組成和Verilog實例。
TCAM對於一個帶mask的表項,如:“1000 * * * * ”。
為表達流表項,我們在下載流表之前我們需要做一步計算,
首先將其分解為entry1 和 mask:
第二步,令entry1' = entry1 & mask
所以entry1' = 10000000
將entry1' 和mask 下載存入TCAM表項組中:
在做查找的時候,key廣播到每個表項組中。之后將key和當前表項組中的mask做與運算,如key = 10001010. key& mask = 10001010 & 11110000 = 10000000
最后再和entry做比較,如果相等則將1寫入結果寄存器。之后所有的結果匯總到優先級選路器中。並得到id編號。
優先級選路器:
可以用function函數實現:
參考代碼請看這里一個粗糙的實現:https://github.com/qiaosiyi/progASICp4SWITCH/blob/master/tcam.v
這樣我們基本上就可以用Verilog語言去實現了,其次要注意的是,廣播,復制,或者做邏輯運算,都會比較占用時延,不要在一個時鍾周期去做,很可能無法完成時序約束。
建議一個操作使用一個時鍾周期,所以tcam查找我這里延遲了四個周期,但是fully-pipeline。吞吐還是一周期一次。
有時候表項很多,也許優先級選路器timing收不了,其實可以考慮將這一步延長倆周期做。其實本質相當於降低了tcam處理頻率。
關於CAM:
CAM與TCAM類似,CAM是精確匹配,key廣播到每個entry,然后比較出結果匯總到優先選路器中,得到id。比tcam操作步驟減少了一些,而且邏輯資源也減少了很多。
可以在這里看一下我粗糙的代碼:https://github.com/qiaosiyi/progASICp4SWITCH/blob/master/cam.v
========================
qsy
15MAR2019