先說說上次流回來的芯片的測試情況。
4月23日, 芯片采用裸片直接切片, bond在板子上,外面加了一個小塑料殼來保護,我們就直接拿回來測試了。
測試的主要分為模擬和數字兩部分, 數字部分的模塊基本都工作正常, 模擬的芯片不一致性很成問題,一共就回來了兩片芯片,可是模擬部分的參數不同,同時設置的寄存器給出的可調參數也起不到作用,很讓人困惑。于是,查到了5月2日又有一次流片計劃,于是急急忙忙的就開始準備了。
很匆忙的, sky1301再次流出一版,其實有三個版本, v01主要就是模擬根據3月2日流出的芯片測試情況改變了模擬部分的一些電路,數字部分就是糾正了之前版本的一些問題,比如clear_fifo 命令, rx的parity的錯誤問題, tx的取crc的時機;v02則是數字部分添加了提速模塊和防碰撞的cl_rx模塊;v03就是typeA沒提速,沒加anti-collision加上了typeB的數字收發模塊,能完成最基本的通信流。這三個版本的模擬部分是一模一樣的。
1周時間,老實說還是挺緊的。其中的提速模塊由于之前dr寫的也測試過很久的時間了,基本已經定下來了,我主要負責是防碰撞的測試,由華老師來負責改代碼,測試中還是發現了不少的問題的,比如總是在發生碰撞的時候會多往fifo里面多寫1byte的無效數據,當碰撞bit是0或是1的時候就不能正常工作等問題。
基本在測試的工程中,問題也都暴露了出來,結果最后的模塊我覺得魯棒性還是不錯的,還是等芯片回來好好測試吧。
接著是v03的芯片,加上了typeB協議的實現,tx方面用的是之前我寫的發送模塊,rx方面用的是杜主任寫的一個模塊,最后時間測試的還真的是很緊張的,不過在基本測試完anti-collision的時候,就開始了typeB的測試,杜主任的模塊犯了一個錯誤就是threshold的初值是0,而他翻轉的invert_pulse的高有效,正好是counter == threshold的時候,結果在reset完到配置到正常工作的threshold值的時候就會發生錯誤的翻轉,于是就不能正常解得所要的數據。當把門限的初值改成非0,比如說正常工作的值是12,改成12,在reset后到正常配置錢的時候就不會發生不正常的翻轉,數據就可以正常的解得。
封裝好的第一版芯片估計還還得一周左右回來,芯片回來肯定還得好好測試吧。接著再有一個半月,這次5月2日的芯片就又要回來了,新一輪的測試就要開始了,拭目以待。
再接著說說這次后仿的問題,后仿也就是一天多一點的時間跑完的,由于后端做的東西基本就是基于上一版的,問題不是很多,主要呢就是碰到了兩個問題。
第一個問題就是關于reset的問題,就比如像下面的波形圖所致,reset肯定是異步的,但是后端的工具在生成器件之后拿給我們進行仿真,在器件庫里data所在的dff對reset上升沿那里的時序是有一個recovery time的要求的,就是b和c之間的時間,為什么呢,可以這么理解,當你在reset的時候前一級的dff和本級的dff同時被復位,而此時你想將reset的電平抬起,脫離reset的狀態,如果這樣的話,前一級的D端的數據就會反映到Q端,使得本級的D端的數據無法滿足和本級的CP端的時序要求,從而使得仿真會紅,報出violation。所以如果想避免這種情況,就要使reset的上升沿與本級的clock上升沿離的足夠遠,按我的理解就應該至少比本級D端與CP的setup time要遠(實際考慮上一級的Q端與本級的D端之間的組合邏輯延時與線延時就要更長)。這樣就應該可以了。
第二個問題就是比如現在的case,我要仿真的是tx,結果rx模塊會報一些不會紅的violation,這是什么原因的呢,還是我們的rst_n起到的作用,就是說你在下達SPI_cmd(CMD_SW_RST)的時候,結果你由于rst會傳遞到各個模塊的各個寄存器,結果有一些模塊雖然沒工作但是依然處于工具檢查的狀態,雖然最后不影響結果但是依然會紅,會有影響,通常這種情況只要有異步的rst信號,就會有可能發生這種情況,如果真的是不用care的問題,那么可以在仿真的時候簡單的加一個延時,讓rst_n posedge 和clk posedge相隔的遠一些就好了,基本就沒有問題。同時,如果是可能產生的影響的話,雖然是異步的rst信號,就都要重新弄一個同步的版本給后面的模塊!