實習期間主要是做乙個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難就難在這點上了。如果硬上,意志堅強的話還能挺過來,但最後還得回頭來補習基...