基于Verilog語言的可維護(hù)性設(shè)計技術(shù)
發(fā)布時間:2008/8/12 0:00:00 訪問次數(shù):693
1、設(shè)計重用與可維護(hù)性設(shè)計
設(shè)計重用是一個很大的概念,嚴(yán)格來講,可驗證性設(shè)計和可維護(hù)性設(shè)計都在設(shè)計重用之列?删S護(hù)性設(shè)計的目的本身就是便于設(shè)計重用,便于讓后來人讀懂前人所寫的代碼,但設(shè)計重用包括的內(nèi)容更廣泛。
設(shè)計重用講的是設(shè)計總體風(fēng)格而不是設(shè)計的細(xì)節(jié),“it is about forests, rather than trees”。最重要的概念:本地化(locality)――一定要盡量使問題本地化,這樣有利于問題的排除。對于大的設(shè)計尤為重要。
三條基本原則
盡量采用全同步設(shè)計,將輸入和輸出寄存,這樣有利于將時序優(yōu)化本地化
采用bottom-up驗證方法,保證每個子模塊的功能是正確的,然后再進(jìn)行整體驗證。
花時間設(shè)計一個好的設(shè)計規(guī)范,力圖使這樣的規(guī)范具有好的體系結(jié)構(gòu)和模塊劃分,這樣有利于本地化的有效實現(xiàn)。
一個好的設(shè)計應(yīng)該包括:完備的文檔、好風(fēng)格的代碼、詳盡的注釋、良好易用的驗證環(huán)境和魯棒的腳本。
影響設(shè)計重用的障礙本質(zhì)上說是管理和企業(yè)文化;開發(fā)和管理內(nèi)部ip資源是最大的重用挑戰(zhàn)。
關(guān)于設(shè)計重用這里不再討論,否則就有喧賓奪主之嫌了。
2、關(guān)于代碼可擴(kuò)展性的一點討論
代碼可擴(kuò)展性實際上也包括在設(shè)計重用之內(nèi)。代碼可擴(kuò)展性或稱可擴(kuò)展性設(shè)計要求便于向?qū)硇碌脑O(shè)計過渡。比如64位的pci標(biāo)準(zhǔn)出來的時候,現(xiàn)行的32位pci接口設(shè)計模塊可以通過比較簡單的改動而變?yōu)?4位,而不需要一切從頭再來。一般設(shè)計中通過定義參數(shù)和宏來便于修改。典型例子就是總線:
`define word 16
`define dword 32
reg [`word-1:0] intruction
reg [`dword-1:0] data_bus,addr_bus;
當(dāng)然代碼可擴(kuò)展性不僅僅包括參數(shù)和宏的使用,如下例:
module tri_buf(in,out, ena);
parameter width=8;
input [width-1:0] in;
output[width-1:0] out;
input ena;
assign out= ena?in:’bz;
endmodule
這是一段有潛在問題的代碼,verilog將高位擴(kuò)展為0來匹配輸出,所以當(dāng)width>32時,上述代碼是有問題的,仿真的時候甚至都看不出來,因此不利于可擴(kuò)展性。象這樣的問題可以用verilog lint等工具來檢查。
3、可讀性最重要
可讀性最重要。許多設(shè)計者有個習(xí)慣:追求盡量用短的代碼來完成同樣的功能,國內(nèi)許多考試中也要求用少于多少行的代碼完成某某功能(很不好的傾向)。對于hdl,我不推薦這樣的風(fēng)格,因為綜合工具會幫助你完成優(yōu)化工作。我的建議是:同樣的代碼可長可短,不要為了減少行數(shù)而影響可讀性。如下例:
module rrarb(request,grant,reset,clk);
input [1:0] request;
output[1:0]grant;
input reset;
input clk;
wire winner;
reg last_winner;
reg [1:0] grant;
wire[1:0] next_grant;
assign next_grant[0]=~reset&(request[0] & (~request[1]|last_winner));
assugn next_grant[1]=~reset& (request[1] &(~request[0]| ~last_winner));
assign winner=~reset & ~next_grant[0] &(last_winner | next_grant[1]);
always @(posedge clk)
begin
last_winner=winner;
grant=next_grant;
end
當(dāng)request[1:0]=2’b00,時,last_winner會發(fā)生什么變化?上面的代碼可讀性較之下面的代碼差很多。
module rrarb(request,grant,reset,clk);
input [1:0] request;
output[1:0]grant;
input reset;
input clk;
wire winner;
reg last_winner;
reg [1:0] grant;
always @(posedge clk)
begin
if(reset) begin
grant<=2’b00;
last_winner<=0;
end
else begin
grant<=2’b00;
if(request!=2’b00) begin:find_winner
reg winner;
case(request)
2’b01:winner<=0;
2’b10:winner<=1;
2’b11:if (last_winner==1’b0) winner<=1;
else winner<=0;
default:winner<=0;
endcase
grant[winner] <=1’b1;
last_winner<=winner;
end
end
end
endmodule
上述兩個代碼的綜合結(jié)果差不多。而且上面第一段代碼在always塊內(nèi)采用阻塞賦值的方法也存在潛在問題。
4、要有好的注釋風(fēng)格
要有好的注釋風(fēng)格。減少注釋的行數(shù)跟節(jié)約代碼的行數(shù)一樣,我不推薦。像代碼有好壞一樣,注釋也有好壞之分。比如:
//increment addr
addr<=addr+1;
上例中的注釋就是一句廢話,因為地址加1是不言自明的
1、設(shè)計重用與可維護(hù)性設(shè)計
設(shè)計重用是一個很大的概念,嚴(yán)格來講,可驗證性設(shè)計和可維護(hù)性設(shè)計都在設(shè)計重用之列?删S護(hù)性設(shè)計的目的本身就是便于設(shè)計重用,便于讓后來人讀懂前人所寫的代碼,但設(shè)計重用包括的內(nèi)容更廣泛。
設(shè)計重用講的是設(shè)計總體風(fēng)格而不是設(shè)計的細(xì)節(jié),“it is about forests, rather than trees”。最重要的概念:本地化(locality)――一定要盡量使問題本地化,這樣有利于問題的排除。對于大的設(shè)計尤為重要。
三條基本原則
盡量采用全同步設(shè)計,將輸入和輸出寄存,這樣有利于將時序優(yōu)化本地化
采用bottom-up驗證方法,保證每個子模塊的功能是正確的,然后再進(jìn)行整體驗證。
花時間設(shè)計一個好的設(shè)計規(guī)范,力圖使這樣的規(guī)范具有好的體系結(jié)構(gòu)和模塊劃分,這樣有利于本地化的有效實現(xiàn)。
一個好的設(shè)計應(yīng)該包括:完備的文檔、好風(fēng)格的代碼、詳盡的注釋、良好易用的驗證環(huán)境和魯棒的腳本。
影響設(shè)計重用的障礙本質(zhì)上說是管理和企業(yè)文化;開發(fā)和管理內(nèi)部ip資源是最大的重用挑戰(zhàn)。
關(guān)于設(shè)計重用這里不再討論,否則就有喧賓奪主之嫌了。
2、關(guān)于代碼可擴(kuò)展性的一點討論
代碼可擴(kuò)展性實際上也包括在設(shè)計重用之內(nèi)。代碼可擴(kuò)展性或稱可擴(kuò)展性設(shè)計要求便于向?qū)硇碌脑O(shè)計過渡。比如64位的pci標(biāo)準(zhǔn)出來的時候,現(xiàn)行的32位pci接口設(shè)計模塊可以通過比較簡單的改動而變?yōu)?4位,而不需要一切從頭再來。一般設(shè)計中通過定義參數(shù)和宏來便于修改。典型例子就是總線:
`define word 16
`define dword 32
reg [`word-1:0] intruction
reg [`dword-1:0] data_bus,addr_bus;
當(dāng)然代碼可擴(kuò)展性不僅僅包括參數(shù)和宏的使用,如下例:
module tri_buf(in,out, ena);
parameter width=8;
input [width-1:0] in;
output[width-1:0] out;
input ena;
assign out= ena?in:’bz;
endmodule
這是一段有潛在問題的代碼,verilog將高位擴(kuò)展為0來匹配輸出,所以當(dāng)width>32時,上述代碼是有問題的,仿真的時候甚至都看不出來,因此不利于可擴(kuò)展性。象這樣的問題可以用verilog lint等工具來檢查。
3、可讀性最重要
可讀性最重要。許多設(shè)計者有個習(xí)慣:追求盡量用短的代碼來完成同樣的功能,國內(nèi)許多考試中也要求用少于多少行的代碼完成某某功能(很不好的傾向)。對于hdl,我不推薦這樣的風(fēng)格,因為綜合工具會幫助你完成優(yōu)化工作。我的建議是:同樣的代碼可長可短,不要為了減少行數(shù)而影響可讀性。如下例:
module rrarb(request,grant,reset,clk);
input [1:0] request;
output[1:0]grant;
input reset;
input clk;
wire winner;
reg last_winner;
reg [1:0] grant;
wire[1:0] next_grant;
assign next_grant[0]=~reset&(request[0] & (~request[1]|last_winner));
assugn next_grant[1]=~reset& (request[1] &(~request[0]| ~last_winner));
assign winner=~reset & ~next_grant[0] &(last_winner | next_grant[1]);
always @(posedge clk)
begin
last_winner=winner;
grant=next_grant;
end
當(dāng)request[1:0]=2’b00,時,last_winner會發(fā)生什么變化?上面的代碼可讀性較之下面的代碼差很多。
module rrarb(request,grant,reset,clk);
input [1:0] request;
output[1:0]grant;
input reset;
input clk;
wire winner;
reg last_winner;
reg [1:0] grant;
always @(posedge clk)
begin
if(reset) begin
grant<=2’b00;
last_winner<=0;
end
else begin
grant<=2’b00;
if(request!=2’b00) begin:find_winner
reg winner;
case(request)
2’b01:winner<=0;
2’b10:winner<=1;
2’b11:if (last_winner==1’b0) winner<=1;
else winner<=0;
default:winner<=0;
endcase
grant[winner] <=1’b1;
last_winner<=winner;
end
end
end
endmodule
上述兩個代碼的綜合結(jié)果差不多。而且上面第一段代碼在always塊內(nèi)采用阻塞賦值的方法也存在潛在問題。
4、要有好的注釋風(fēng)格
要有好的注釋風(fēng)格。減少注釋的行數(shù)跟節(jié)約代碼的行數(shù)一樣,我不推薦。像代碼有好壞一樣,注釋也有好壞之分。比如:
//increment addr
addr<=addr+1;
上例中的注釋就是一句廢話,因為地址加1是不言自明的
熱門點擊
- 典型ASIC設(shè)計主要流程
- LDRA工具套件支持最新發(fā)布的MISRA C
- Agilent推出GENESYS EDA軟件
- FPGA設(shè)計層次分析
- 基于Verilog語言的可維護(hù)性設(shè)計技術(shù)
- 在選用FPGA進(jìn)行設(shè)計時如何降低功耗
- Synopsys推出IC COMPILER布
- PLC可編程序控制器基礎(chǔ)知識
- 時序邏輯等效性檢查方法使設(shè)計風(fēng)險降至最低
- FPGA器件選型研究
推薦技術(shù)資料
- 聲道前級設(shè)計特點
- 與通常的Hi-Fi前級不同,EP9307-CRZ這臺分... [詳細(xì)]
- MOSFET 電感單片降壓開關(guān)模式變換器優(yōu)勢
- SiC MOSFET 和 IG
- 新型 電隔離無芯線性霍爾效應(yīng)電
- 業(yè)界超小絕對位置編碼器技術(shù)參數(shù)設(shè)計
- 高帶寬、更高分辨率磁角度傳感技術(shù)應(yīng)用探究
- MagAlpha 角度位置傳感
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究