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

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

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

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

ZYNQ ? 來(lái)源:ZYNQ ? 作者:ZYNQ ? 2022-11-25 09:26 ? 次閱讀

	

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

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

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

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

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

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

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

  • 由于組合邏輯的位置不同而引起過(guò)多的觸發(fā)器綜合 如下面兩個(gè)例子
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個(gè);

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

組合邏輯單開(kāi),只有3個(gè)觸發(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

是同步邏輯,而下例則使用了組合邏輯作時(shí)鐘,以及異步復(fù)位.實(shí)際的運(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
  • 對(duì)組合邏輯的描述有多種方式 其綜合結(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];
可以選擇簡(jiǎn)潔的寫法.
  • 考慮綜合的執(zhí)行時(shí)間
通常會(huì)推薦將模塊劃分得越小越好, 事實(shí)上要從實(shí)際的設(shè)計(jì)目標(biāo), 面積和時(shí)序要求出發(fā)。好的時(shí)序規(guī)劃和合適的約束條件要比電路的大小對(duì)綜合時(shí)間的影響要大。要依照設(shè)計(jì)的目標(biāo)來(lái)劃分模塊, 對(duì)該模塊綜合約束的scripts也可以集中在該特性上。要選擇合適的約束條件, 過(guò)分的約束將導(dǎo)致漫長(zhǎng)的綜合時(shí)間。最好在設(shè)計(jì)階段就做好時(shí)序規(guī)劃 。通過(guò)綜合的約束scripts來(lái)滿足時(shí)序規(guī)劃。這樣就能獲得既滿足性能的結(jié)果 ,又使得綜合時(shí)間最省 。從代碼設(shè)計(jì)講 ,500~5000行的長(zhǎng)度是合適的。
  • 避免點(diǎn)到點(diǎn)的例外
所謂點(diǎn)到點(diǎn)例外 Point-to-point exception ,就是從一個(gè)寄存器的輸出到另一個(gè)寄存器的輸入的路徑不能在一個(gè)周期內(nèi)完成。多周期路徑就是其典型情況 。多周期路徑比較麻煩, 在靜態(tài)時(shí)序分析中要標(biāo)注為例外, 這樣可能會(huì)因?yàn)槿藶橐蛩貙⑵渌窂藉e(cuò)誤地標(biāo)注為例外, 從而對(duì)該路徑?jīng)]有分析, 造成隱患。避免使用多周期路徑, 如果確實(shí)要用 ,應(yīng)將它放在單獨(dú)一個(gè)模塊, 并且在代碼中加以注釋。
  • 避免偽路徑(False path)
偽路徑是那些靜態(tài)時(shí)序分析 STA 認(rèn)為是時(shí)序失敗, 而設(shè)計(jì)者認(rèn)為是正確的路徑。通常會(huì)人為忽略這些warning ,但如果數(shù)量較多時(shí) ,就可能將其他真正的問(wèn)題錯(cuò)過(guò)了。
  • 避免使用Latch
使用Latch必須有所記錄, 可以用All_registers -level_sensitive來(lái)報(bào)告設(shè)計(jì)中用到的Latch 。不希望使用Latch時(shí) ,應(yīng)該對(duì)所有輸入情況都對(duì)輸出賦值, 或者將條件賦值語(yǔ) 句寫全, 如在if語(yǔ)句最后加一個(gè)else, case語(yǔ)句加defaults。
  • 當(dāng)你必須使用Latch時(shí) ,為了提高可測(cè)性, 需要加入測(cè)試邏輯。
不完整的if和case語(yǔ)句導(dǎo)致不必要的latch的產(chǎn)生, 下面的語(yǔ)句中 DataOut會(huì)被綜合成鎖存器 。如果不希望在電路中使用鎖存器, 它就是錯(cuò)誤。
always@(Cond)
begin
if(Cond)
DataOut<=DataInend
  • 避免使用門控時(shí)鐘

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

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

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

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

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

將這些信號(hào)的產(chǎn)生放在頂層的一個(gè)獨(dú)立模塊, 這樣所有的子模塊分別使用單一的時(shí)鐘和復(fù)位信號(hào)。一般情況下內(nèi)部門控時(shí)鐘可以用同步置數(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編寫示例

下面是一個(gè)格雷碼的測(cè)試模塊,
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中避免使用絕對(duì)的時(shí)間,如#20,#15或#(CYC+15)等,應(yīng)該在文件前面使用parameter定義一些常量,使得時(shí)間的定義象#(CYC+OFF0)的形式,便于修改。

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

  3. 對(duì)大的設(shè)計(jì)的頂層仿真 ,一般不要對(duì)所有信號(hào)跟蹤, 波形文件會(huì)很大, 仿真時(shí)間延長(zhǎng),可以有選擇的觀測(cè)一些信號(hào)。

審核編輯:郭婷


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

    關(guān)注

    28

    文章

    1351

    瀏覽量

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

    關(guān)注

    30

    文章

    4807

    瀏覽量

    68800

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Verilog 與 ASIC 設(shè)計(jì)的關(guān)系 Verilog 代碼優(yōu)化技巧

    Verilog與ASIC設(shè)計(jì)的關(guān)系 Verilog作為一種硬件描述語(yǔ)言(HDL),在ASIC設(shè)計(jì)扮演著至關(guān)重要的角色。ASIC(Application Specific Integrated
    的頭像 發(fā)表于 12-17 09:52 ?167次閱讀

    Verilog 測(cè)試平臺(tái)設(shè)計(jì)方法 Verilog FPGA開(kāi)發(fā)指南

    Verilog測(cè)試平臺(tái)設(shè)計(jì)方法是Verilog FPGA開(kāi)發(fā)的重要環(huán)節(jié),它用于驗(yàn)證Verilog設(shè)計(jì)的正確性和性能。以下是一個(gè)詳細(xì)的Verilog
    的頭像 發(fā)表于 12-17 09:50 ?333次閱讀

    Verilog與VHDL的比較 Verilog HDL編程技巧

    Verilog 與 VHDL 比較 1. 語(yǔ)法和風(fēng)格 VerilogVerilog 的語(yǔ)法更接近于 C 語(yǔ)言,對(duì)于有 C 語(yǔ)言背景的工程師來(lái)說(shuō),學(xué)習(xí)曲線較平緩。它支持結(jié)構(gòu)化編程,代碼
    的頭像 發(fā)表于 12-17 09:44 ?241次閱讀

    如何自動(dòng)生成verilog代碼

    介紹幾種自動(dòng)生成verilog代碼的方法。
    的頭像 發(fā)表于 11-05 11:45 ?383次閱讀
    如何自動(dòng)生成<b class='flag-5'>verilog</b><b class='flag-5'>代碼</b>

    Verilog硬件描述語(yǔ)言參考手冊(cè)

    一. 關(guān)于 IEEE 1364 標(biāo)準(zhǔn)二. Verilog簡(jiǎn)介三. 語(yǔ)法總結(jié)四. 編寫Verilog HDL源代碼的標(biāo)準(zhǔn)五. 設(shè)計(jì)流程
    發(fā)表于 11-04 10:12 ?2次下載

    Verilog語(yǔ)法運(yùn)算符的用法

    verilog語(yǔ)法中使用以下兩個(gè)運(yùn)算符可以簡(jiǎn)化我們的位選擇代碼
    的頭像 發(fā)表于 10-25 15:17 ?1055次閱讀
    <b class='flag-5'>Verilog</b>語(yǔ)法<b class='flag-5'>中</b>運(yùn)算符的用法

    110kv變電站設(shè)計(jì)規(guī)范

    110kV變電站設(shè)計(jì)規(guī)范涉及多個(gè)方面,包括選址、電氣設(shè)計(jì)、設(shè)備選擇、安全保護(hù)等。以下是根據(jù)相關(guān)規(guī)范和標(biāo)準(zhǔn)整理的一些主要設(shè)計(jì)規(guī)范: 一、總則 目的與范圍 :規(guī)范適用于電壓為35~110k
    的頭像 發(fā)表于 09-26 09:32 ?2395次閱讀

    怎么樣提高verilog代碼編寫水平?

    ,共同進(jìn)步。 歡迎加入FPGA技術(shù)微信交流群14群! 交流問(wèn)題(一) Q:怎么樣提高verilog代碼編寫水平?Cpu 從事DFT工作。目前僅限于寫一些簡(jiǎn)單模塊。自學(xué)的話如何提高verilog
    發(fā)表于 09-25 20:05

    pcb設(shè)計(jì)中有哪些常用設(shè)計(jì)規(guī)范

    在PCB(Printed Circuit Board,印刷電路板)設(shè)計(jì),常用的設(shè)計(jì)規(guī)范涉及多個(gè)方面,以確保電路板的性能、可靠性、可制造性和可維護(hù)性。以下是一些主要的設(shè)計(jì)規(guī)范: 一、電氣設(shè)計(jì)規(guī)
    的頭像 發(fā)表于 09-02 14:51 ?1194次閱讀

    嵌入式系統(tǒng)C語(yǔ)言的編寫規(guī)范

    最重要的一條規(guī)則 編寫代碼時(shí)最重要的一條規(guī)則是:檢查周圍的代碼并嘗試模仿它。 作為維護(hù)人員,如果收到的補(bǔ)丁明顯與周圍代碼的編碼風(fēng)格不同,這是令人沮喪的。這是不尊重人的,就像某人穿著泥濘
    的頭像 發(fā)表于 05-11 08:49 ?1193次閱讀

    代碼檢查的方式有三種

    等方面的問(wèn)題。那么在代碼檢查服務(wù),提到的編程規(guī)范,規(guī)則集,規(guī)則,規(guī)則用例(場(chǎng)景、誤報(bào)、檢出)分別代表什么意思呢? 編程規(guī)范 在 SAST 靜態(tài)代碼
    的頭像 發(fā)表于 02-25 10:08 ?872次閱讀
    <b class='flag-5'>代碼</b>檢查的方式有三種

    PCB layout在布線上的設(shè)計(jì)規(guī)范有哪些?

    一站式PCBA智造廠家今天為大家講講pcb layout設(shè)計(jì)需要注意哪些細(xì)節(jié)?pcb layout設(shè)計(jì)規(guī)范。Printed Circuit Board (PCB)是一種電子零件,它是連接電子器件,如
    的頭像 發(fā)表于 02-23 09:19 ?892次閱讀

    verilog function函數(shù)的用法

    Verilog 是一種硬件描述語(yǔ)言 (HDL),主要用于描述數(shù)字電子電路的行為和結(jié)構(gòu)。在 Verilog ,函數(shù) (Function) 是一種用于執(zhí)行特定任務(wù)并返回一個(gè)值的可重用代碼
    的頭像 發(fā)表于 02-22 15:49 ?5914次閱讀

    verilog函數(shù)和任務(wù)對(duì)比

    verilog,函數(shù)和任務(wù)均用來(lái)描述共同的代碼段,并且在模式內(nèi)任意位置被調(diào)用,提高代碼效率,讓代碼更加的直觀,提高
    的頭像 發(fā)表于 02-12 18:43 ?905次閱讀

    怎么用emac實(shí)現(xiàn)Verilog自動(dòng)連線呢?

    我們?cè)?b class='flag-5'>編寫一些比較復(fù)雜的Verilog代碼時(shí),通常需要進(jìn)行大量的手動(dòng)連線工作,這種工作十分容易出錯(cuò),并且在代碼模塊的嵌套層級(jí)較多時(shí),更改里層的一個(gè)
    的頭像 發(fā)表于 01-24 10:03 ?1427次閱讀