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

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

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

數(shù)字芯片中的verilog代碼描述

西西 ? 來(lái)源:IP與SoC設(shè)計(jì) ? 作者:知芯情報(bào)局 ? 2022-09-14 15:47 ? 次閱讀

書(shū)接上文,數(shù)字芯片中典型的低功耗設(shè)計(jì)是添加clk gate。另外還有一種方法是并行與流水技術(shù)。

并行與流水

硬件描述語(yǔ)言的一個(gè)突出優(yōu)點(diǎn)就是指令執(zhí)行的并行性。多條語(yǔ)句能夠在相同時(shí)鐘周期內(nèi)并行處理多個(gè)信號(hào)數(shù)據(jù)。但是當(dāng)數(shù)據(jù)串行輸入時(shí),指令執(zhí)行的并行性并不能體現(xiàn)出其優(yōu)勢(shì)。而且很多時(shí)候有些計(jì)算并不能在一個(gè)或兩個(gè)時(shí)鐘周期內(nèi)執(zhí)行完畢,如果每次輸入的串行數(shù)據(jù)都需要等待上一次計(jì)算執(zhí)行完畢后才能開(kāi)啟下一次的計(jì)算,那效率是相當(dāng)?shù)偷摹A魉€就是解決多周期下串行數(shù)據(jù)計(jì)算效率低的問(wèn)題。一般來(lái)講,對(duì)于一個(gè)功能模塊,可以通過(guò)并行的方式實(shí)現(xiàn),也可以通過(guò)流水線的方式實(shí)現(xiàn),這兩種方法都是用資源換速度。

對(duì)于并行處理,可以同時(shí)處理多條執(zhí)行語(yǔ)句,使執(zhí)行效率變高。在滿足設(shè)計(jì)SPEC的前提下,通過(guò)并行處理,可減小時(shí)鐘頻率,從而達(dá)到降低功耗的目的。舉例,若實(shí)現(xiàn)4 個(gè)數(shù)據(jù)乘加運(yùn)算,可以采用 1 個(gè)乘法器來(lái)實(shí)現(xiàn),也可以通過(guò) 2 個(gè)乘法器(并行)來(lái)實(shí)現(xiàn) ,verilog代碼描述分別如下:

//1 multiplier, high speedmodule mul1_hs

input

clk ,

//200MHz

input

rstn ,

input

en ,

input [3:0]

mul1 ,

//data in

input [3:0]

mul2 ,

//data in

output

dout_en ,

output [8:0]

dout

);

reg

flag ;

reg

en_r ;

always @(posedge clk or negedge rstn) begin

if (!rstn) begin

flag

《= 1‘b0 ;

en_r

《= 1’b0 ;

end

else if (en) begin

flag

《= ~flag ;

en_r 《= 1‘b1 ;

end

else begin

flag

《= 1’b0 ;

en_r

《= 1‘b0 ;

end

end

wire [7:0]

result = mul1 * mul2 ;

// data output en

reg [7:0]

res1_r, res2_r ;

always @(posedge clk or negedge rstn) be

gin

if (!rstn) begin

res1_r

《= ’b0 ;

res2_r

《= ‘b0 ;

end

else if (en & !flag) begin

res1_r

《= result ;

end

else if (en & flag) begin

res2_r

《= result ;

end

end

assign dout_en = en_r & !flag ;

assign dout = res1_r + res2_r ;

endmodule

//===========================================//

2 multiplier2, low speedmodule mul2_ls (

input

clk ,

//100MHz

input

rstn ,

input

en , input [3:0]

mul1 ,

//data in

input [3:0]

mul2 ,

//data in

input [3:0] mul3 ,

//data in

input [3:0]

mul4 ,

//data in

output

dout_en,

output [8:0]

dout

);

wire [7:0]

result1 = mul1 * mul2 ;

wire [7:0]

result2 = mul3 * mul4 ;

//en delay

reg

en_r ;

always @(posedge clk or negedge rstn) begin

if (!rstn) begin

en_r

《= 1’b0 ;

end

else begin

en_r

《= en ;

end end

// data output en

reg [7:0]

res1_r, res2_r ;

always @(posedge clk or negedge rstn) begin

if (!rstn) begin

res1_r

《= ‘b0 ;

res2_r

《= ’b0 ;

end

else if (en) begin

res1_r

《= result1 ;

res2_r

《= result2 ;

end end

assign dout

= res1_r + res2_r ;

assign dout_en

= en_r ;

endmodule

tb測(cè)試平臺(tái)描述如下:

`timescale 1ns/1psmodule test ;

reg

rstn ;

//mul1_hs reg

hs_clk; reg

hs_en ; reg [3:0]

hs_mul1 ; reg [3:0]

hs_mul2 ;

wire

hs_dout_en ;

wire [8:0] hs_dout ;

//mul1_ls reg

ls_clk = 0;

reg

ls_en ;

reg [3:0]

ls_mul1 ;

reg [3:0]

ls_mul2 ;

reg [3:0]

ls_mul3 ;

reg [3:0]

ls_mul4 ;

wire

ls_dout_en ;

wire [8:0]

ls_dout ;

//clock generating

real

CYCLE_200MHz = 5 ; //

always begin

hs_clk = 0 ; #(CYCLE_200MHz/2) ;

hs_clk = 1 ; #(CYCLE_200MHz/2) ;

end

always begin

@(posedge hs_clk) ls_clk = ~ls_clk ;

end

//reset

generating

initial begin

rstn

= 1‘b0 ;

#8 rstn

= 1’b1 ;

end

//motivation

initial begin

hs_mul1 = 0 ;

hs_mul2 = 16 ;

hs_en = 0 ;

#103 ;

repeat(12) begin

@(negedge hs_clk) ;

hs_en

= 1 ;

hs_mul1

= hs_mul1 + 1;

hs_mul2

= hs_mul2 - 1;

end hs_en = 0 ; end

initial begin

ls_mul1 = 1 ;

ls_mul2 = 15 ;

ls_mul3 = 2 ;

ls_mul4 = 14 ;

ls_en = 0 ;

#103 ;

@(negedge ls_clk) ls_en = 1;

repeat(5) begin

@(negedge ls_clk) ;

ls_mul1 = ls_mul1 + 2;

ls_mul2 = ls_mul2 - 2;

ls_mul3 = ls_mul3 + 2;

ls_mul4 = ls_mul4 - 2;

end ls_en = 0 ;

end

//module instantiation

mul1_hs

u_mul1_hs (

.clk

(hs_clk),

.rstn

(rstn), .en

(hs_en),

.mul1

(hs_mul1),

.mul2

(hs_mul2),

.dout

(hs_dout),

.dout_en

(hs_dout_en) );

mul2_ls

u_mul2_ls

( .clk

(ls_clk),

.rstn

(rstn),

.en

(ls_en),

.mul1

(ls_mul1),

.mul2

(ls_mul2), .mul3

(ls_mul3),

.mul4

(ls_mul4),

.dout

(ls_dout),

.dout_en

(ls_dout_en) );

//simulation finish

always begin

#100;

if ($time 》= 1000) begin

#1 ;

$finish ;

end

end

endmodule

下圖為仿真結(jié)果,兩種實(shí)現(xiàn)方法的結(jié)果是相同的,但是對(duì)于并行處理方法,由于其時(shí)鐘頻率降低了1/2,功耗也會(huì)隨之降低,但是電路面積會(huì)隨之增加。

對(duì)于一個(gè)處于連續(xù)工作模式的 N 級(jí)流水線,效率提升N倍。與并行設(shè)計(jì)類(lèi)似,流水線設(shè)計(jì)也可以通過(guò)降低工作頻率,達(dá)到降低功耗的目的。除此之外,我們可以將流水線設(shè)計(jì)分成 N 級(jí)流水線,假設(shè)新的路徑長(zhǎng)度為L(zhǎng)new,原始路徑長(zhǎng)度為L(zhǎng)old,則Lnew=1/N*Lold。如果時(shí)鐘頻率保持固定,則在一個(gè)周期內(nèi),不需要對(duì)原來(lái)的電容 C 進(jìn)行充放電,只需要對(duì)電容 C/N 進(jìn)行充放電。因此可以采用較低的電壓來(lái)驅(qū)動(dòng)芯片電路,從而達(dá)到降低功耗的目的。

資源共享與狀態(tài)編碼

對(duì)于某設(shè)計(jì),一個(gè)相同的邏輯在多處被調(diào)用時(shí),可以對(duì)該邏輯進(jìn)行資源共享,以降低功耗。例如,對(duì)于一個(gè)比較邏輯,沒(méi)有使用資源共享的代碼描述如下:

always @(*) begin

case (mode) :

3‘b000:

result = 1’b1 ;

3‘b001:

result = 1’b0 ;

3‘b010:

result = value1 == value2 ;

3’b011:

result = value1 != value2 ;

3‘b100:

result = value1 》 value2 ;

3’b101:

result = value1 《 value2 ;

3‘b110:

result = value1 》= value2 ;

3’b111:

result = value1 《= value2 ;

endcase

end

改進(jìn)后,使用資源共享的代碼描述如下:

wire equal_con

= value1 == value2 ;

wire great_con

= value1 》 value2 ;

always @(*) begin

case (mode) :

3‘b000:

result = 1’b1 ;

3‘b001:

result = 1’b0 ;

3‘b010:

result = equal_con ;

3’b011:

result = equal_con ;

3‘b100:

result = great_con ;

3’b101:

result = !great_con && !equal_con ;

3‘b110:

result = great_con && equal_con ;

3’b111:

result = !great_con ;

endcase end

第一種方法綜合實(shí)現(xiàn)時(shí),如果編譯器優(yōu)化做的不好,可能需要 6 個(gè)比較器。第二種資源共享的方法只需要 2 個(gè)比較器即可完成相同的邏輯功能,因此在一定程度會(huì)減少功耗。

對(duì)于一些變化頻繁的信號(hào),翻轉(zhuǎn)率相對(duì)較高,功耗相對(duì)較大??梢岳脿顟B(tài)編碼的方式來(lái)降低開(kāi)關(guān)活動(dòng),減少功耗。例如高速計(jì)數(shù)器工作時(shí),使用格雷碼代替二進(jìn)制編碼時(shí),每一時(shí)刻只有 1bit 的數(shù)據(jù)翻轉(zhuǎn),翻轉(zhuǎn)率降低,功耗隨之降低。例如進(jìn)行狀態(tài)機(jī)設(shè)計(jì)時(shí),狀態(tài)機(jī)切換前后的狀態(tài)編碼如果只有 1bit 的差異,也會(huì)減少翻轉(zhuǎn)率。

操作數(shù)隔離

操作數(shù)隔離就是在進(jìn)行一些操作比如選擇器的時(shí)候,我們選擇的那個(gè)選項(xiàng)有A和B,但是如果我們直到選擇的是A,那么B之前一大堆計(jì)算就顯得沒(méi)有必要了。所以操作數(shù)隔離也就是增加一些選擇器件,如果這個(gè)操作數(shù)不需要的話就不選擇它以及不進(jìn)行之前計(jì)算這個(gè)操作數(shù)所需要的操作。 沒(méi)有使用操作數(shù)隔離時(shí),Verilog 代碼描述如下:

module isolated(A,B,C,D,clk,clr,choose,result);

input wire clk;input wire clr;input wire [1:0]choose;input wire [31:0]A;input wire [31:0]B;input wire [31:0]C;input wire [31:0]D;output reg [31:0]result; wire [31:0]choose_a;wire [31:0]choose_b;wire [31:0]choose_c;wire [31:0]choose_d;

//這是一個(gè)簡(jiǎn)單的mux,先計(jì)算出A,B,C,D的值再選擇 assign choose_a = A*B;assign choose_b = A+B+C+D;assign choose_c = B*C;assign choose_d = C*D; always@(posedge clk,posedge clr)begin if(clr) result 《= 0;else begin if(choose == 2‘b00) result 《= choose_a;else if(choose == 2’b01) result 《= choose_b;else if(choose == 2‘b10) result 《= choose_c;else result 《= choose_d;endendendmodule

使用操作數(shù)隔離時(shí),Verilog 代碼描述如下:

module isolated2(A,B,C,D,clk,clr,choose,result);

input wire clk;input wire clr;input wire [1:0]choose;input wire [31:0]A;input wire [31:0]B;input wire [31:0]C;input wire [31:0]D;output reg [31:0]result; reg [31:0]choose_A;reg [31:0]choose_B;reg [31:0]choose_C;reg [31:0]choose_D;reg [1:0]cho;//這是一個(gè)使用了isolated的mux,先根據(jù)信號(hào)然后相應(yīng)計(jì)算所需的A,B,C或者D的值always@(posedge clk,posedge clr

)begin if(clr) begin choose_A 《= 0; choose_B 《= 0; choose_C 《= 0; choose_D

《= 0;cho 《= 0;endelse if(choose == 2’b00) begin choose_A 《= A; choose_B 《= B; choose_C 《= choose_C; choose_D 《= choose_D; cho 《= 0; endelse if(choose == 2‘b01)

begin choose_A 《= A; choose_B 《= B; choose_C 《= C; choose_D

《= D; cho 《= 1; endelse if(choose == 2’b10) begin choose_A 《= choose_A; choose_B 《= B; choose_C 《= C; choose_D 《= choose_D; cho 《= 2; endelse begin choose_A 《= choose_A; choose_B

《= choose_B; choose_C 《= C; choose_D 《= D; cho 《= 3; endendalways@(posedge clk,posedge clr)begin if(clr) result 《= 0;else begin if(cho == 2‘b00) result 《= choose_A*choose_B;

lse if(cho == 2’b01) result 《= choose_A+choose_B+choose_C+choose_D;else if(cho == 2‘b10) result 《= choose_B*choose_C; else result 《= choose_C*choose_D;endend

endmodule

參考文獻(xiàn): https://www.runoob.com/w3cnote/verilog2-rtl-low-power-design-1.html

編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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

    文章

    1333

    瀏覽量

    109718
  • 數(shù)字芯片
    +關(guān)注

    關(guān)注

    1

    文章

    103

    瀏覽量

    18337

原文標(biāo)題:數(shù)字芯片中的低功耗設(shè)計(jì)(二)

文章出處:【微信號(hào):IP與SoC設(shè)計(jì),微信公眾號(hào):IP與SoC設(shè)計(jì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Verilog硬件描述語(yǔ)言描述.

    本書(shū)簡(jiǎn)要介紹了Verilog硬件描述語(yǔ)言的基礎(chǔ)知識(shí),包括語(yǔ)言的基本內(nèi)容和基本結(jié)構(gòu) ,以及利用該語(yǔ)言在各種層次上對(duì)數(shù)字系統(tǒng)的建模方法。書(shū)中列舉了大量實(shí)例,幫助讀者掌握語(yǔ)
    發(fā)表于 03-27 23:44 ?101次下載

    Verilog HDL硬件描述語(yǔ)言【書(shū)籍

    本書(shū)簡(jiǎn)要介紹了Verilog 硬件描述語(yǔ)言的基礎(chǔ)知識(shí),包括語(yǔ)言的基本內(nèi)容和基本結(jié)構(gòu),以及利用該語(yǔ)言在各種層次上對(duì)數(shù)字系統(tǒng)的建模方法。書(shū)中列舉了大量實(shí)例,幫助讀者掌握
    發(fā)表于 07-02 14:55 ?124次下載

    Verilog HDL代碼描述對(duì)狀態(tài)機(jī)綜合的研究

    有許多可綜合狀態(tài)機(jī)的Verilog代碼描述風(fēng)格,不同代碼描述風(fēng)格經(jīng)綜合后得到電路的物理實(shí)現(xiàn)在速度和面積上有很大差別。優(yōu)秀的
    發(fā)表于 12-24 00:52 ?30次下載
    <b class='flag-5'>Verilog</b> HDL<b class='flag-5'>代碼</b><b class='flag-5'>描述</b>對(duì)狀態(tài)機(jī)綜合的研究

    Verilog代碼覆蓋率檢查

    Verilog代碼覆蓋率檢查是檢查驗(yàn)證工作是否完全的重要方法,代碼覆蓋率(codecoverge)可以指示Verilog代碼
    發(fā)表于 04-29 12:35 ?8246次閱讀

    verilog硬件描述語(yǔ)言課程講義

    verilog硬件描述語(yǔ)言課程講義
    發(fā)表于 05-21 15:01 ?33次下載
    <b class='flag-5'>verilog</b>硬件<b class='flag-5'>描述</b>語(yǔ)言課程講義

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

    Verilog硬件描述語(yǔ)言參考手冊(cè),Verilog語(yǔ)法內(nèi)容介紹
    發(fā)表于 11-12 17:20 ?0次下載

    verilog_代碼資料

    verilog_代碼資料,非常實(shí)用的代碼示例。
    發(fā)表于 02-18 15:00 ?37次下載

    Verilog硬件描述語(yǔ)言

    VHDL語(yǔ)言編程學(xué)習(xí)Verilog硬件描述語(yǔ)言
    發(fā)表于 09-01 15:27 ?0次下載

    uart串口代碼verilog

     Verilog HDL是一種硬件描述語(yǔ)言(HDL:Hardware Description Language),以文本形式來(lái)描述數(shù)字系統(tǒng)硬件的結(jié)構(gòu)和行為的語(yǔ)言,用它可以表示邏輯電路圖
    發(fā)表于 11-09 17:34 ?7473次閱讀
    uart串口<b class='flag-5'>代碼</b><b class='flag-5'>verilog</b>

    Verilog語(yǔ)法基礎(chǔ)

    Verilog HDL是一種用于數(shù)字系統(tǒng)設(shè)計(jì)的語(yǔ)言。用Verilog HDL描述的電路設(shè)計(jì)就是該電路的Verilog HDL模型也稱(chēng)為模塊。
    的頭像 發(fā)表于 03-08 14:29 ?1.3w次閱讀

    FPGA之硬件語(yǔ)法篇:用Verilog代碼仿真與驗(yàn)證數(shù)字硬件電路

    數(shù)字電路中學(xué)到的邏輯電路功能,使用硬件描述語(yǔ)言(Verilog/VHDL)描述出來(lái),這需要設(shè)計(jì)人員能夠用硬件編程思維來(lái)編寫(xiě)代碼,以及擁有扎實(shí)
    的頭像 發(fā)表于 12-05 07:10 ?3207次閱讀
    FPGA之硬件語(yǔ)法篇:用<b class='flag-5'>Verilog</b><b class='flag-5'>代碼</b>仿真與驗(yàn)證<b class='flag-5'>數(shù)字</b>硬件電路

    Verilog教程之Verilog HDL程序設(shè)計(jì)語(yǔ)句和描述方式

    本文檔的主要內(nèi)容詳細(xì)介紹的是Verilog教程之Verilog HDL程序設(shè)計(jì)語(yǔ)句和描述方式。
    發(fā)表于 12-09 11:24 ?46次下載
    <b class='flag-5'>Verilog</b>教程之<b class='flag-5'>Verilog</b> HDL程序設(shè)計(jì)語(yǔ)句和<b class='flag-5'>描述</b>方式

    如何使用Verilog HDL描述可綜合電路?

    1、如何使用Verilog HDL描述可綜合電路 Verilog 有什么奇技淫巧?我想最重要的是理解其硬件特性。Verilog HDL語(yǔ)言?xún)H是對(duì)已知硬件電路的文本
    的頭像 發(fā)表于 04-04 11:19 ?4051次閱讀
    如何使用<b class='flag-5'>Verilog</b> HDL<b class='flag-5'>描述</b>可綜合電路?

    數(shù)字芯片設(shè)計(jì)流程之verilog設(shè)計(jì)

    數(shù)字芯片設(shè)計(jì)流程:功能驗(yàn)證之前與工藝庫(kù)沒(méi)多大聯(lián)系,驗(yàn)證芯片設(shè)計(jì)的功能是否正確,針對(duì)抽象的代碼進(jìn)行功能驗(yàn)證理想值。一致性驗(yàn)證確保生成的網(wǎng)表和代碼
    發(fā)表于 11-05 15:51 ?29次下載
    <b class='flag-5'>數(shù)字</b><b class='flag-5'>芯片</b>設(shè)計(jì)流程之<b class='flag-5'>verilog</b>設(shè)計(jì)

    使用Verilog/SystemVerilog硬件描述語(yǔ)言練習(xí)數(shù)字硬件設(shè)計(jì)

    HDLBits 是一組小型電路設(shè)計(jì)習(xí)題集,使用 Verilog/SystemVerilog 硬件描述語(yǔ)言 (HDL) 練習(xí)數(shù)字硬件設(shè)計(jì)~
    的頭像 發(fā)表于 08-31 09:06 ?1501次閱讀