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

21IC電子網(wǎng) |

【華為】verilog語言編寫規(guī)范(三)

ZYNQ
2025-11-09 21:59
關(guān)鍵字:
收藏
		



5.2 代碼編寫中容易出現(xià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中第一條語句始終不變,浪費(fèi)運(yùn)算時(shí)間.   

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

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

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

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

  • 由于組合邏輯的位置不同而引起過多的觸發(fā)器綜合 如下面兩個(gè)例子
module COUNT (AndBits, Clk, Rst);
 Output Andbits;
 Input Clk,
 Rst;
 Reg AndBits; //internal reg Reg [2:0] Count;
 always @(posedge Clk) begin
 begin if (Rst) Count <= #u_dly 0; else Count <= #u_dly Count + 1;
 End //end if AndBits <= #u_dly & Count; End //end always endmodule

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

module COUNT (AndBits, Clk, Rst);
 Output AndBits;
 Input Clk,
 Rst;
 Reg AndBits; //internal reg Reg [2:0] Count;
 always @(posedge Clk) begin //synchronous if (Rst)
 Count <= #u_dly 0; else Count <= #u_dly Count + 1;
 End //end always always @(Count) begin //asynchronous AndBits = & Count;
 End //end always Endmodule //end COUNT 

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

  • 謹(jǐn)慎使用異步邏輯
module COUNT (Z, Enable, Clk, Rst);
 Output [2:0] Z;
 Input Rst,
Enable,
 Clk;
 
 reg [2:0] Z;
 always @(posedge Clk) begin if (Rst) begin
 Z <= #u_dly 1'b0; end else if (Enable == 1'b1) begin If (Z == 3'd7) begin
 Z <= #u_dly 1'b0;
 End else begin
 Z <= #u_dly Z + 1'b1;
 end
 End
 Else ;
 End //end always Endmodule //end COUNT 

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

module COUNT (Z, Enable, Clk, Rst);
 Output [2:0] Z;
 Input Rst,
 Enable,
 Clk;
 Reg [2:0] Z; //internal wire wire GATED_Clk = Clk & Enable;
 always @(posedge GATED_Clk or posedge Rst) begin if (Rst) begin
 Z <= #u_dly 1'b0; end else begin if (Z == 3'd7) begin
 Z <= #u_dly 1'b0;
end else begin
 Z <= #u_dly Z + 1'b1;
 end
 End //end if End //end always Endmodule //end module 
  • 對(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)來劃分模塊, 對(duì)該模塊綜合約束的scripts也可以集中在該特性上。要選擇合適的約束條件, 過分的約束將導(dǎo)致漫長的綜合時(shí)間。最好在設(shè)計(jì)階段就做好時(shí)序規(guī)劃 。通過綜合的約束scripts來滿足時(shí)序規(guī)劃。這樣就能獲得既滿足性能的結(jié)果 ,又使得綜合時(shí)間最省 。從代碼設(shè)計(jì)講 ,500~5000行的長度是合適的。
  • 避免點(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í) ,就可能將其他真正的問題錯(cuò)過了。
  • 避免使用Latch
使用Latch必須有所記錄, 可以用All_registers -level_sensitive來報(bào)告設(shè)計(jì)中用到的Latch 。不希望使用Latch時(shí) ,應(yīng)該對(duì)所有輸入情況都對(duì)輸出賦值, 或者將條件賦值語 句寫全, 如在if語句最后加一個(gè)else, case語句加defaults。
  • 當(dāng)你必須使用Latch時(shí) ,為了提高可測(cè)性, 需要加入測(cè)試邏輯。
不完整的if和case語句導(dǎo)致不必要的latch的產(chǎn)生, 下面的語句中 DataOut會(huì)被綜合成鎖存器 。如果不希望在電路中使用鎖存器, 它就是錯(cuò)誤。
always @(Cond) begin if (Cond) DataOut <= DataIn end
  • 避免使用門控時(shí)鐘

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

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

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

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

模塊中所有的寄存器最好同時(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 ﹕
 Called by ﹕ 
 Revision History ﹕mm/dd/yy
 Revision 1.0
 Email ﹕ M@sz.huawei.com.cn
 Company ﹕ Huawei Technology .Inc
 Copyright(c) 1999, Huawei Technology Inc, All right reserved
\* */ Module module_name(
  Output_ports, //comment ; port description Input_ports, //comment ; port description Io_ports, //comment ; port descripttion Clk_port, //comment ; port description Rst_port //comment ; port description ); //port declarations Output [31:;0] Dataout;
 Input [31:0] Datain;
 Inout Bi_dir_signal;
 Input input1,
 Input2; //interrnal wire/reg declarations Wire [31:0] internal_data;
 Reg output_enable; //module instantiations , Self-build module Module_name1 Uinstance_name1(...); Module_name2 Uinstance_name2(...); // TSC4000 cell DTC12 V1 (.Clk(Clk), .CLRZ(Clr), .D(Data), .Q(Qout)); //continuous assignment Assign Data_out = out_enable ? Internal_data : 32’hz; //always block Always @(input2)
 Begin
 ...
 End //function and task definitions Functiom [function_type] function_name;
   Declarations_of_inputs;
  [declarations_of_local_variables];
   Begin
    Behavirol_statement;
    Function_name = function_express;
   End
  Endfunction //end function_name Endmodule //end module_name  

6.2 testbench編寫示例

下面是一個(gè)格雷碼的測(cè)試模塊, module TB_GRAY;
 reg Clock;
 reg Reset;
 wire [7:0] Qout;
 integer fout; //輸出文件指針 parameter CYC = 20; GRAY DUT(.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 #CYC Clock = ~ Clock; //輸出數(shù)據(jù)到文件gray.dat always @(posedge Clock)
begin
  $fwrite(fout,"%d %b\n",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ù)文件則既可以快速定位 ,也可以通過編寫的小程序工具對(duì)它進(jìn)行進(jìn)一步的處理。

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


相關(guān)推薦