日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 工業(yè)控制 > 電子設(shè)計自動化
[導(dǎo)讀]隨著集成電路制造技術(shù)的發(fā)展,對設(shè)計提出了更多的挑戰(zhàn),隨著設(shè)計復(fù)雜度的增加,又提出了片上系統(tǒng)(SoC)的概念。為了加速設(shè)計收斂,設(shè)計重用、可測性設(shè)計、可驗證性設(shè)計和可維護(hù)性設(shè)計得到了更多重視。本文以VerilogHD

隨著集成電路制造技術(shù)的發(fā)展,對設(shè)計提出了更多的挑戰(zhàn),隨著設(shè)計復(fù)雜度的增加,又提出了片上系統(tǒng)(SoC)的概念。為了加速設(shè)計收斂,設(shè)計重用、可測性設(shè)計、可驗證性設(shè)計和可維護(hù)性設(shè)計得到了更多重視。本文以VerilogHDL為例,對可維護(hù)性設(shè)計進(jìn)行了初步探討。

1、設(shè)計重用與可維護(hù)性設(shè)計

設(shè)計重用是一個很大的概念,嚴(yán)格來講,可驗證性設(shè)計和可維護(hù)性設(shè)計都在設(shè)計重用之列。可維護(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)和模塊劃分,這樣有利于本地化的有效實(shí)現(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ò)展性的一點(diǎn)討論

代碼可擴(kuò)展性實(shí)際上也包括在設(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是不言自明的。這樣的注釋反而會影響可讀性。好的注釋應(yīng)該給出該段代碼的使用目的,它能夠給不熟悉這段代碼的人以信息。如下例:

//In burst mode,the bytes are written in consecutive addresses.Need to access the next address to verify that the next byte was properly saved.
Addr<=addr+1;

關(guān)于如何注釋我在設(shè)計重用里面講過,這里不再重復(fù),請參考[2]。

5、應(yīng)盡量將聲明本地化

這種辦法有點(diǎn)類似于C++中封裝的概念,應(yīng)盡量保持變量的可見性在必要的范圍內(nèi),不要產(chǎn)生不必要的交互。
如下例:
integer I;

always
begin
for(I=0;I<32;I=I+1) begin … end
end

always
begin
for(I=15;I>=0;I=I-1) begin … end
end

對于兩段代碼來講,I是全局的,他們的不必要的交互會產(chǎn)生不可預(yù)料的結(jié)果。在verilog里面,你可以將I定義到always塊里面,使I只對當(dāng)前塊可見。如下例:

always
begin:block1
integer I;
for(I=0;I<32;I=I+1) begin … end
end

always
begin:block2
integer I;
for(I=15;I>=0;I=I-1) begin … end
end

在Verilog里面其它使變量本地化的方法是采用function 和task。Function和task中定義的變量只對其內(nèi)部可見。
Task send;
Input [7:0] data;

Reg parity;
Begin

end
endtask
function [31:0] average;
input [31:0] val1;
input[31:0] val2;
reg [32:0] sum;
begin
sum=val1+val2;
average=sum/2;
end
endfunction;

另外,還要提一句關(guān)于`define VS parameter。一般設(shè)計中都要有一個頭文件,里面用`define定義了一些宏。而模塊中又有可能用parameter定義一些參數(shù)。兩者的區(qū)別是一個是全局的一個是本地的。設(shè)計者可以根據(jù)需要進(jìn)行定義。定義成本地參數(shù)避免可以避免同其他模塊的變量名字沖突。定義成全局的宏則可以在整個設(shè)計的各個文件中使用。千萬不可為了方便全部定義成宏。

6、子程序封裝

封裝有利于程序的可維護(hù)性。如果程序中多次用到一段代碼,應(yīng)根據(jù)實(shí)際情況盡量將它定義為function、task或module。這樣做可以減少代碼長度,提高可維護(hù)行和可驗證性。

下面以testbench為例說明。

通常一個SoC設(shè)計中,需要首先設(shè)計和驗證各個子模塊,然后才進(jìn)行系統(tǒng)級驗證,因此要多次用到testbench。每個testbench中都要初始化時鐘、進(jìn)行系統(tǒng)復(fù)位等。這些多次用到的代碼不如寫在單獨(dú)的一個文件(不妨稱作basic.v)中,各個testbench只要使用include將他們包括進(jìn)來就可以直接使用了。

下面是我在最近的863項目中寫的basic.v去掉一些注釋后的內(nèi)容,可以直接copy使用。

要求將時鐘定義為clk,復(fù)位管腳定義為rst,高有效。
//start of basic.v
event ENDSIM;
// CYCLE monitor and end-of-simulation checker.
task monitor_cycles;
input max_cycles;
integer max_cycles;
integer cycles;
begin
cycles = 0;
fork
// Count cycles.
forever begin
@(posedge clk);
cycles = cycles + 1;
end

// Watch for max cycles. If we detect max cycles then throw our testbench ENDSIM event.
//
begin
wait (cycles == max_cycles);
$display ("MAXIMUM CYCLES EXCEEDED!");
->ENDSIM;
end
join
end
endtask
// Reset
task reset;
begin
rst = 1;
#200;
rst = 0;
$display ("End RESET.");
end
endtask

// Drive the clock input
task drive_clock;
begin
clk = 0;
forever begin
#(`CLKLO) clk = 1;
#(`CLKHI) clk = 0;
end
end
endtask

// ************* BASIC CONFIDENCE Test Tasks **************
//
// BASIC CONFIDENCE Test.
//
// This task will fork off all the other necessary tasks to cause reset, drive the clock, etc. etc.
//
//
task clk_rst_gen_and_stop_at;
input cycle_num;
begin
$display ("designed by Chenxi. Email:chenxiee@mails.tsinghua.edu.cn");
fork
// Capture data
capture_data;

// Run the clock
drive_clock;

// Do a reset
reset;
begin
monitor_cycles(cycle_num);
end
// Catch end of simulation event due to max number of cycles or pattern from PIC code.
begin
@(ENDSIM); // Catch the event.
$display ("End of simulation signalled. Killing simulation in a moment.");
#0; // Let anything else see this event...
$stop;
end
join
end
endtask
//end of basiv .v
在testbench中可以直接例化使用。
//somemodule_tb.v
module somemodule_tb;
`include “basic.v”
initial begin
// ** This is our top-level "Basic Confidence" test.

//generatr rst,clk,and stop at 5000 cycles
clk_rst_gen_and_stop_at(5000);

end

endmodule //End of somemodule_tb.v

需要注意的是basic.v不能夠單獨(dú)編譯。直接編譯testbench就可以了。上述方法也在可綜合的代碼中使用。
參考文獻(xiàn)[1]推薦的另外一種辦法是將上述basic.v用模塊封裝起來。如下例:
module basic;
integer warnings;
integer errors;
initial
begin
warnings=0;
errors=0;
end
task warning;
input[80*8:1] msg;
begin
$write(“Warning at %t: %s”,$time,msg);
warnings=warnings+1;
end
endtask
task terminate;
begin
$write(“Simulation Completedn”);
$stop;
end

endmodule
調(diào)用辦法:
module somemodule_tb;
initial
begin

if(…) basic.warning(”Unexpected response detected”);

basic.terminate;
end
endmodule

7、結(jié)論

本文VerilogHDL為例,從可重用性與可維護(hù)性的關(guān)系、代碼可擴(kuò)展性設(shè)計、盡量增加可讀性和使變量本地化、參數(shù)(parameter)和宏(`define)的對比以及封裝子程序的角度探討了可維護(hù)性設(shè)計應(yīng)遵守的幾條基本原則。



參考文獻(xiàn):

[1].PCIdatasheethttp://www.dzsc.com/datasheet/PCI_1201469.html.


來源:ks990次

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在當(dāng)今數(shù)字化時代,邊緣 AI 正以前所未有的態(tài)勢改變著我們的生活與產(chǎn)業(yè)格局。從智能安防到自動駕駛,從醫(yī)療健康到工業(yè)制造,邊緣 AI 的身影無處不在。然而,要實(shí)現(xiàn)邊緣 AI 的全面適用,仍面臨諸多挑戰(zhàn),而負(fù)責(zé)任的賦能技術(shù)則...

關(guān)鍵字: 邊緣 技術(shù) 數(shù)字化

在科技飛速發(fā)展的當(dāng)下,汽車行業(yè)正經(jīng)歷著一場深刻變革,汽車通信系統(tǒng)作為其中的關(guān)鍵領(lǐng)域,展現(xiàn)出了極為光明的前景。其中,車對車(V2V)和車對基礎(chǔ)設(shè)施(V2I)技術(shù)憑借其在避免事故方面的卓越潛力,成為了人們關(guān)注的焦點(diǎn)。

關(guān)鍵字: 汽車 通信系統(tǒng) 技術(shù)

在全球經(jīng)濟(jì)格局深度調(diào)整的當(dāng)下,企業(yè)面臨著日益激烈的市場競爭。為了在這一浪潮中脫穎而出,實(shí)現(xiàn)可持續(xù)發(fā)展,數(shù)字化轉(zhuǎn)型已成為企業(yè)的必然選擇。而技術(shù)創(chuàng)新作為推動數(shù)字化轉(zhuǎn)型的核心驅(qū)動力,正引領(lǐng)著企業(yè)邁向高 “智” 量發(fā)展的新征程。

關(guān)鍵字: 數(shù)字化 技術(shù) 創(chuàng)新

隨著人工智能、大數(shù)據(jù)、物聯(lián)網(wǎng)等新一代技術(shù)的蓬勃發(fā)展,物流行業(yè)正經(jīng)歷著前所未有的變革。物流智慧化改造,即以智能化、自動化為核心,通過引入先進(jìn)的技術(shù)手段,優(yōu)化物流流程,提升運(yùn)營效率,已成為物流行業(yè)發(fā)展的重要趨勢。智能物流系統(tǒng)...

關(guān)鍵字: 物流 智能 技術(shù)

近年來,隨著科技的飛速發(fā)展,自動駕駛技術(shù)正逐步從概念走向現(xiàn)實(shí),并在全球范圍內(nèi)掀起了一場新的技術(shù)革命。在這場革命中,L3級自動駕駛作為邁向更高階自動駕駛的關(guān)鍵一步,成為了各大車企和技術(shù)提供商競相角逐的重頭戲。本文將深入探討...

關(guān)鍵字: 自動駕駛 技術(shù) L3級

在21世紀(jì)的科技浪潮中,人類社會正以前所未有的速度邁向智能化時代。從智能家居到智慧城市,從智能制造到智慧醫(yī)療,技術(shù)的每一次飛躍都在深刻改變著我們的生活、工作與思維方式。在這個充滿無限可能的時代,匯聚全球領(lǐng)先技術(shù),共同繪制...

關(guān)鍵字: 智能化 技術(shù) 智慧藍(lán)圖

3D打印技術(shù)(3D printing technology)是一種以數(shù)字模型為基礎(chǔ),通過逐層累加材料的方式制造物體的技術(shù)。它已經(jīng)在許多領(lǐng)域引起了廣泛的關(guān)注和應(yīng)用,包括制造業(yè)、醫(yī)療領(lǐng)域、建筑業(yè)、藝術(shù)設(shè)計等。本文將圍繞3D打...

關(guān)鍵字: 3D打印 數(shù)字模型 技術(shù)

3D打印技術(shù)在醫(yī)療領(lǐng)域的應(yīng)用日益廣泛,它不僅能夠提供個性化的醫(yī)療解決方案,還能夠快速制造醫(yī)療器械和人體組織模型,為醫(yī)生和患者帶來了許多益處。本文將詳細(xì)介紹3D打印技術(shù)在醫(yī)療方面的應(yīng)用,并探討其所起到的作用。

關(guān)鍵字: 3D打印 醫(yī)療 技術(shù)

6月21日消息,最近在法國巴黎舉行的聯(lián)合國教科文組織首屆阿勒福贊獎頒獎儀式上,中國科學(xué)院古脊椎動物與古人類研究所付巧妹獲得阿勒福贊科學(xué)、技術(shù)、工程、數(shù)學(xué)領(lǐng)域杰出青年科學(xué)家國際獎(簡稱"阿勒福贊獎")。

關(guān)鍵字: 科學(xué) 技術(shù) 工程

DSP又稱數(shù)字信號處理器,數(shù)字信號處理是將信號以數(shù)字方式表示并處理的理論和技術(shù)。數(shù)字信號處理與模擬信號處理是信號處理的子集。數(shù)字信號處理的目的是對真實(shí)世界的連續(xù)模擬信號進(jìn)行測量或濾波。因此在進(jìn)行數(shù)字信號處理之前需要將信號...

關(guān)鍵字: DSP 技術(shù) 信號處理
關(guān)閉