乙個小白的數字IC驗證入門之路 狀態機

2021-10-21 07:53:12 字數 1909 閱讀 5808

實習期間主要是做乙個risc-cpu的設計和驗證。

關於risc-cpu,大家可以在網上找到挺多的資料。大概包含以下這些模組:

1,算術邏輯運算部件(alu)

2,累加器

3,程式計數器

4,指令暫存器,解碼器

5,時序和控制部件

大致上執行的過程呢,就是 程式計數器 做位址上的操作,跳轉乙個指定的位址,或者自加。每個位址呢,就是取指令了,指令進行解碼,決定下一步的操作,取資料也好,計算,存資料也好。更具體的大家可以尋找資料自己嘗試實現一下。

這裡我想說說我收穫最大的部分,就是在實現的過程,對狀態機的使用了。以前在學校學到三段式狀態機,還是懵懵懂懂的。在做risc-cpu的時候認認真真的學習後,覺得狀態機對於設計而言真的是很便利的。

比如現在有3個狀態:idle, fetch, decode

大致結構如下,第一段,狀態跳**

always@( posedge clk or negedge rst_n ) begin //狀態跳轉 時序邏輯

if( !rst_n ) begin

state <= idle;

end else begin

state <= next_state;

endend

always( * ) begin  //獲得下一狀態 組合邏輯

case( state )

idle: begin

if( ..... ) next_state = fetch; //符合某一條件進入下一狀態

else next_state = idle; //未符合保持在當前狀態

endfetch:begin

if( ..... ) next_state = decode; //符合某一條件進入下一狀態

else next_state = fetch; //未符合保持在當前狀態

enddecode:begin

if( ..... ) next_state = idle; //符合某一條件進入下一狀態

else next_state = decode; //未符合保持在當前狀態

enddefault:begin

endendcase

end

第三段,根據控制與輸出:

假設a, b 訊號用於不同狀態下的輸入與控制

always( posedge clk or negedge rst_n ) begin  //獲得下一狀態 組合邏輯

if( !rst_n ) begin

a <= ....

b <= ....

end else begin

case( state )

idle: begin

a <= .... //某些賦值, 輸出, 控制

b <= ....

endfetch:begin

a <= .... //某些賦值, 輸出, 控制

b <= ....

enddecode:begin

a <= .... //某些賦值, 輸出, 控制

b <= ....

enddefault:begin

endendcase

end

三段式的好處個人覺得有二:

乙個就是功能上各段分的都很清晰,各段做什麼分割的清楚。方便設計,也方便檢查。

其二便是對於後續的優化也清晰,當成最簡狀態機( 狀態只有1bit, 輸出控制只有1bit )來看,兩個dff中間夾著組合一套邏輯,如果綜合約束不滿足,時鐘路徑也是便於查詢的。

下次講講我所理解的驗證的思想,方法。

乙個小白的數字ic驗證入門之路–簡單的驗證思想

乙個小白的數字IC驗證入門之路 簡單的驗證思想

如文章所敘述中,經歷了 簡單的驗證環境搭建,和 模組化設計 後 這些都是我在學校接觸的較少的 我開始跨進了這個門。其實這些理解是歷經了多個專案後慢慢總結下來,而不是經歷了risc cpu這個簡單的過程就認識到,但這裡先做簡單敘述,便於之後我講述時的分類。本質 我們拋開驗證方法,工具,結果分析什麼的,...

乙個前端小白的面試之路

第一次寫自己的部落格,居然是寫自己的職業,哈哈,算是一種緣分吧,只是想講講自己的面試之路 想來自己的第一次面試也不是自己的職業,而是做兼職,我還清晰的記得是去某飲料廠裝箱。那是在學校的貼吧裡面看見了招聘,想著反正寒假也沒啥事,就去試試,面試也沒什麼技術含量,當然,只是去當苦力的,手腳和心智健全就應該...

乙個VC愛好者的入門之路

乙個vc愛好者的入門之路 看到那些對vc不知從何下手而苦苦掙扎的朋友,希望我的學習之路能給他們一下借鑑。學vc並不是傳說的那麼難,可不下些功夫是學不成的。學程式設計急不得,沒有程式設計的基礎知識上來就學vc肯定碰一頭灰,說vc難就難在這點上了。如果硬上,意志堅強的話還能挺過來,但最後還得回頭來補習基...