91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

代碼編寫中verilog的設(shè)計規(guī)范

ZYNQ ? 來源:ZYNQ ? 作者:ZYNQ ? 2022-11-25 09:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


	

5.2 代碼編寫中容易出現(xiàn)的問題

  • 在for-loop中包括不變的表達(dá)式 浪費運(yùn)算時間
for(i=0;i<4;i=i+1)
begin
Sig1=Sig2;
DataOut[i]=DataIn[i];
end

for-loop中第一條語句始終不變,浪費運(yùn)算時間.

  • 資源共享問題 條件算子中不存在 資源共享 ,如
z=(cond)?(a+b):(c+d);

必須使用兩個加法器; 而等效的條件if-then-else語句則可以資源共享 如

if(Cond)
z=a+b;
else
z=c+d;

只要加法器的輸入端復(fù)用,就可以實現(xiàn)加法器的共享,使用一個加法器實現(xiàn)。

  • 由于組合邏輯的位置不同而引起過多的觸發(fā)器綜合 如下面兩個例子
moduleCOUNT(AndBits,Clk,Rst);
OutputAndbits;
InputClk,
Rst;
RegAndBits;
//internalreg

Reg[2:0]Count;
always@(posedgeClk)begin
begin
if(Rst)
Count<=#u_dly0;
else
Count<=?#u_dly?Count?+?1;
End//endif
AndBits<=?#u_dly?&?Count;
?End?//endalways
endmodule

在進(jìn)程里的變量都綜合成觸發(fā)器了,有4個;

moduleCOUNT(AndBits,Clk,Rst);
OutputAndBits;
InputClk,
Rst;
RegAndBits;
//internalreg
Reg[2:0]Count;
always@(posedgeClk)begin//synchronous
if(Rst)
Count<=?#u_dly?0;
else
Count<=?#u_dly?Count?+?1;
End//endalways
always@(Count)begin//asynchronous
AndBits=&Count;
End//endalways
Endmodule//endCOUNT

組合邏輯單開,只有3個觸發(fā)器.

  • 謹(jǐn)慎使用異步邏輯
moduleCOUNT(Z,Enable,Clk,Rst);
Output[2:0]Z;
InputRst,
Enable,
Clk;

reg[2:0]Z;
always@(posedgeClk)begin
if(Rst)begin
Z<=#u_dly1'b0;
end
elseif(Enable==1'b1)begin
If(Z==3'd7)begin
Z<=#u_dly1'b0;
End
elsebegin
Z<=?#u_dly?Z?+?1'b1;
end
End
Else;
End//endalways
Endmodule//endCOUNT

是同步邏輯,而下例則使用了組合邏輯作時鐘,以及異步復(fù)位.實際的運(yùn)用中要加以避免.

moduleCOUNT(Z,Enable,Clk,Rst);
Output[2:0]Z;
InputRst,
Enable,
Clk;
Reg[2:0]Z;
//internalwire
wireGATED_Clk=Clk&Enable;
always@(posedgeGATED_ClkorposedgeRst)begin
if(Rst)begin
Z<=#u_dly1'b0;
end
elsebegin
if(Z==3'd7)begin
Z<=#u_dly1'b0;
end
elsebegin
Z<=?#u_dly?Z?+?1'b1;
end
End//endif
End//endalways
Endmodule//endmodule
  • 對組合邏輯的描述有多種方式 其綜合結(jié)果是等效的
c=a&b;
等效于
c[3:0]=a[3:0]&b[3:0];
等效于
c[3]=a[3]&b[3];
c[2]=a[2]&b[2];
c[1]=a[1]&b[1];
c[0]=a[0]&b[0];
等效于
for(i=0;i<=3;i=i+1)
c[i]=a[i]&b[i];
可以選擇簡潔的寫法.
  • 考慮綜合的執(zhí)行時間
通常會推薦將模塊劃分得越小越好, 事實上要從實際的設(shè)計目標(biāo), 面積和時序要求出發(fā)。好的時序規(guī)劃和合適的約束條件要比電路的大小對綜合時間的影響要大。要依照設(shè)計的目標(biāo)來劃分模塊, 對該模塊綜合約束的scripts也可以集中在該特性上。要選擇合適的約束條件, 過分的約束將導(dǎo)致漫長的綜合時間。最好在設(shè)計階段就做好時序規(guī)劃 。通過綜合的約束scripts來滿足時序規(guī)劃。這樣就能獲得既滿足性能的結(jié)果 ,又使得綜合時間最省 。從代碼設(shè)計講 ,500~5000行的長度是合適的。
  • 避免點到點的例外
所謂點到點例外 Point-to-point exception ,就是從一個寄存器的輸出到另一個寄存器的輸入的路徑不能在一個周期內(nèi)完成。多周期路徑就是其典型情況 。多周期路徑比較麻煩, 在靜態(tài)時序分析中要標(biāo)注為例外, 這樣可能會因為人為因素將其他路徑錯誤地標(biāo)注為例外, 從而對該路徑?jīng)]有分析, 造成隱患。避免使用多周期路徑, 如果確實要用 ,應(yīng)將它放在單獨一個模塊, 并且在代碼中加以注釋。
  • 避免偽路徑(False path)
偽路徑是那些靜態(tài)時序分析 STA 認(rèn)為是時序失敗, 而設(shè)計者認(rèn)為是正確的路徑。通常會人為忽略這些warning ,但如果數(shù)量較多時 ,就可能將其他真正的問題錯過了。
  • 避免使用Latch
使用Latch必須有所記錄, 可以用All_registers -level_sensitive來報告設(shè)計中用到的Latch 。不希望使用Latch時 ,應(yīng)該對所有輸入情況都對輸出賦值, 或者將條件賦值語 句寫全, 如在if語句最后加一個else, case語句加defaults。
  • 當(dāng)你必須使用Latch時 ,為了提高可測性, 需要加入測試邏輯。
不完整的if和case語句導(dǎo)致不必要的latch的產(chǎn)生, 下面的語句中 DataOut會被綜合成鎖存器 。如果不希望在電路中使用鎖存器, 它就是錯誤。
always@(Cond)
begin
if(Cond)
DataOut<=DataInend
  • 避免使用門控時鐘

使用門控時鐘(Gated clock)不利于移植 ,可能引起毛刺, 帶來時序問題 ,同時對掃描鏈的形成帶來問題。門控鐘在低功耗設(shè)計中要用到 ,但通常不要在模塊級代碼中使用 。可以借助于Power compiler來生成 ,或者在頂層產(chǎn)生。

  • 避免使用內(nèi)部產(chǎn)生的時鐘

在設(shè)計中最好使用同步設(shè)計。如果要使用內(nèi)部時鐘 ,可以考慮使用多個時鐘。因為使用內(nèi)部時鐘的電路要加到掃描鏈中比較麻煩,降低了可測性, 也不利于使用約束條件來綜合。

  • 避免使用內(nèi)部復(fù)位信號

模塊中所有的寄存器最好同時復(fù)位。如果要使用內(nèi)部復(fù)位, 最好將其相關(guān)邏輯放在單獨的模塊中, 這樣可以提高可閱讀性。

  • 如果確實要使用內(nèi)部時鐘, 門控時鐘 ,或內(nèi)部的復(fù)位信號 ,將它們放在頂層。

將這些信號的產(chǎn)生放在頂層的一個獨立模塊, 這樣所有的子模塊分別使用單一的時鐘和復(fù)位信號。一般情況下內(nèi)部門控時鐘可以用同步置數(shù)替代。

6 附錄

6.1 Module 編寫示例

/**
Filename﹕
Author﹕
Description﹕
Calledby﹕
RevisionHistory﹕mm/dd/yy
Revision1.0
Email﹕M@sz.huawei.com.cn
Company﹕HuaweiTechnology.Inc
Copyright(c)1999,HuaweiTechnologyInc,Allrightreserved
**/
Modulemodule_name(
Output_ports,//comment;portdescription
Input_ports,//comment;portdescription
Io_ports,//comment;portdescripttion
Clk_port,//comment;portdescription
Rst_port//comment;portdescription
);

//portdeclarations
Output[31:;0]Dataout;
Input[31:0]Datain;
InoutBi_dir_signal;
Inputinput1,
Input2;

//interrnalwire/regdeclarations
Wire[31:0]internal_data;
Regoutput_enable;

//moduleinstantiations,Self-buildmodule
Module_name1Uinstance_name1(...);
Module_name2Uinstance_name2(...);

//TSC4000cell
DTC12V1(.Clk(Clk),.CLRZ(Clr),.D(Data),.Q(Qout));

//continuousassignment
AssignData_out=out_enable?Internal_data:32’hz;

//alwaysblock
Always@(input2)
Begin
...
End
//functionandtaskdefinitions
Functiom[function_type]function_name;
Declarations_of_inputs;
[declarations_of_local_variables];
Begin
Behavirol_statement;
Function_name=function_express;
End
Endfunction//endfunction_name
Endmodule//endmodule_name

6.2 testbench編寫示例

下面是一個格雷碼的測試模塊,
moduleTB_GRAY;
regClock;
regReset;
wire[7:0]Qout;
integerfout;//輸出文件指針
parameterCYC=20;

GRAYDUT(.Clock(Clock),.Reset(Reset),.Qout(Qout));

initial
begin
Clock=1'b0;
Reset=1'b1;
#(5*CYC)Reset=1'b0;
#(5*CYC)Reset=1'b1;
#(5000*CYC)
$fclose(fout);
$finish;
end

initial
begin
$shm_open("GRAY.shm");
$shm_probe("AS");
fout=$fopen("gray.dat");
end

always#CYCClock=~Clock;


//輸出數(shù)據(jù)到文件gray.dat
always@(posedgeClock)
begin
$fwrite(fout,"%d%b
",Qout,Qout);
end

endmodule
  1. 在testbench中避免使用絕對的時間,如#20,#15或#(CYC+15)等,應(yīng)該在文件前面使用parameter定義一些常量,使得時間的定義象#(CYC+OFF0)的形式,便于修改。

  2. 觀測結(jié)果可以輸出到波形文件GRAY.shm ,或數(shù)據(jù)文件gray.dat 。生成波形文件可以用simwave觀測結(jié)果 ,比較直觀。而生成數(shù)據(jù)文件則既可以快速定位 ,也可以通過編寫的小程序工具對它進(jìn)行進(jìn)一步的處理。

  3. 對大的設(shè)計的頂層仿真 ,一般不要對所有信號跟蹤, 波形文件會很大, 仿真時間延長,可以有選擇的觀測一些信號。

審核編輯:郭婷


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Verilog
    +關(guān)注

    關(guān)注

    30

    文章

    1374

    瀏覽量

    114530
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73988

原文標(biāo)題:【華為】verilog語言編寫規(guī)范(三)

文章出處:【微信號:ZYNQ,微信公眾號:ZYNQ】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    云臺伺服驅(qū)動硬件設(shè)計規(guī)范與實現(xiàn)手冊

    對象,從設(shè)計規(guī)范、電路架構(gòu)、關(guān)鍵模塊實現(xiàn)、PCB 工程規(guī)范、可靠性設(shè)計、測試驗證等方面,形成一套完整、可直接工程化的云臺伺服驅(qū)動硬件設(shè)計手冊,適用于航拍、安防跟蹤、工業(yè)視覺、機(jī)載穩(wěn)定等高精度云臺系統(tǒng)。
    的頭像 發(fā)表于 03-04 15:40 ?68次閱讀

    如果將蜂鳥的risc-v移植到其他的fpga想實現(xiàn)一些外設(shè)功能有什么辦法?可以不用操作系統(tǒng)直接添加verilog代碼嗎?

    請問如果將蜂鳥的risc-v移植到其他的fpga想實現(xiàn)一些外設(shè)功能有什么辦法?可以不用操作系統(tǒng)直接添加verilog代碼嗎?
    發(fā)表于 11-10 06:35

    NucleiStudio如何生成.verilog文件和.dasm文件,以及對.dasm文件自定義指令反匯編結(jié)果分析

    文件,以及對.dasm文件自定義指令反匯編結(jié)果分析。 一、如何生成.verilog和.dasm文件文件 項目右鍵選擇Properties 選擇C/C++ Build下面的Setting 更改
    發(fā)表于 10-24 06:33

    運(yùn)行自己編寫的C語言項目的E203軟件仿真環(huán)境的搭建

    ,如何讓E203能夠在軟件仿真的環(huán)境下運(yùn)行自己編寫的C語言代碼呢? 以下是我們的方案。 首先,hbird-sdkapplicationbaremetal目錄下放置著一些測試程序,以helloworld
    發(fā)表于 10-20 06:44

    技術(shù)資訊 I 面向初級工程師的 PCB 設(shè)計規(guī)范

    工程師和電路板設(shè)計新手而言,掌握PCB設(shè)計規(guī)范至關(guān)重要。本文將深入解析常見的PCB設(shè)計規(guī)范和制造商要求,并概括介紹PCB設(shè)計規(guī)范的關(guān)鍵基礎(chǔ)知識。線距和線寬是實現(xiàn)
    的頭像 發(fā)表于 06-13 16:28 ?1621次閱讀
    技術(shù)資訊 I 面向初級工程師的 PCB <b class='flag-5'>設(shè)計規(guī)范</b>

    干貨!原理圖設(shè)計規(guī)范133條checklist

    原理圖設(shè)計是產(chǎn)品設(shè)計的理論基礎(chǔ),設(shè)計一份規(guī)范的原理圖對設(shè)計PCB、跟機(jī)、做客戶資料具有指導(dǎo)性意義,是做好一款產(chǎn)品的基礎(chǔ)。原理圖設(shè)計基本要求:規(guī)范、清晰、準(zhǔn)確、易讀。因此制定《原理圖設(shè)計規(guī)范》的目的
    的頭像 發(fā)表于 05-22 11:46 ?1108次閱讀
    干貨!原理圖<b class='flag-5'>設(shè)計規(guī)范</b>133條checklist

    PCB 工藝設(shè)計規(guī)范

    發(fā)表于 04-29 17:17

    技術(shù)資料—PCB設(shè)計規(guī)范

    本 PCB 設(shè)計規(guī)范包括:PCB 布線與布局、電路設(shè)計、機(jī)殼、器件選型、系統(tǒng)、線纜與接插件。 按部位分類 技術(shù)規(guī)范內(nèi)容 1 PCB 布線與布局 PCB 布線與布局隔離準(zhǔn)則:強(qiáng)弱電流隔離、大小
    發(fā)表于 04-25 17:24

    133條原理圖設(shè)計規(guī)范checklist

    原理圖設(shè)計是產(chǎn)品設(shè)計的理論基礎(chǔ),設(shè)計一份規(guī)范的原理圖對設(shè)計PCB、跟機(jī)、做客戶資料具有指導(dǎo)性意義,是做好一款產(chǎn)品的基礎(chǔ)。原理圖設(shè)計基本要求: 規(guī)范、清晰、準(zhǔn)確、易讀。 因此制定《原理圖設(shè)計規(guī)范
    發(fā)表于 04-11 10:50

    Verilog編寫規(guī)范

    用最右邊的字符下劃線代表低電平有效,高電平有效的信號不得以下劃線表示,短暫的有效信號建議采用高電平有效。
    的頭像 發(fā)表于 04-11 09:36 ?1092次閱讀

    一百多條PCB設(shè)計規(guī)范(建議收藏)

    1.PCB基本內(nèi)容1.1基礎(chǔ)規(guī)范1、板名+版本號:電路板的唯一名稱,需簡潔明確,反映功能或所屬系統(tǒng)。版本號需與設(shè)計文件、BOM(物料清單)及生產(chǎn)文件嚴(yán)格對應(yīng)。2、設(shè)計日期:設(shè)計完成或修訂的日期,用于
    發(fā)表于 04-10 13:37

    11節(jié)PCB實際案例課程+大廠內(nèi)部PCB設(shè)計規(guī)范文檔(13920字)

    資料介紹 每個課程1個半小時左右,都是講具體設(shè)計案例,非常詳細(xì),需要的朋友自取~ 設(shè)計規(guī)范就更基礎(chǔ)一些!尤其對于新手來說,從PCB的設(shè)計步驟到阻抗計算、bom分析全部都有涉及,還有一些實用的軟件
    發(fā)表于 04-02 15:28

    FPGA Verilog HDL語法之編譯預(yù)處理

    Verilog HDL語言和C語言一樣也提供了編譯預(yù)處理的功能。“編譯預(yù)處理”是Verilog HDL編譯系統(tǒng)的一個組成部分。Verilog HDL語言允許在程序中使用幾種特殊的命令(它們不是一般
    的頭像 發(fā)表于 03-27 13:30 ?1438次閱讀
    FPGA <b class='flag-5'>Verilog</b> HDL語法之編譯預(yù)處理

    RAKsmart企業(yè)服務(wù)器上部署DeepSeek編寫運(yùn)行代碼

    在RAKsmart企業(yè)服務(wù)器上部署并運(yùn)行DeepSeek模型的代碼示例和詳細(xì)步驟。假設(shè)使用 Python + Transformers庫 + FastAPI實現(xiàn)一個基礎(chǔ)的AI服務(wù)。主機(jī)推薦小編為您整理發(fā)布RAKsmart企業(yè)服務(wù)器上部署DeepSeek編寫運(yùn)行
    的頭像 發(fā)表于 03-25 10:39 ?705次閱讀

    本質(zhì)安全設(shè)備標(biāo)準(zhǔn)(IEC60079-11)的理解(四)

    本質(zhì)安全型電子產(chǎn)品設(shè)計規(guī)范
    發(fā)表于 03-24 09:21 ?1次下載