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í)序優(yōu)化之接收端打拍策略探討

冬至子 ? 來(lái)源:芯時(shí)代青年 ? 作者:尼德蘭的喵 ? 2023-12-04 10:20 ? 次閱讀

這篇文章是探討對(duì)接收端進(jìn)行時(shí)序優(yōu)化(即ready打拍,或稱backward打拍)的方式。

ready本身是不攜帶任何隨路信息的,但如果因此就覺(jué)得可以簡(jiǎn)單把ready打一拍來(lái)進(jìn)行時(shí)序優(yōu)化那就大錯(cuò)特錯(cuò)了,要不然可以試一試看看錯(cuò)的多離譜。

無(wú)論valid打拍還是ready打拍,都需要將控制信號(hào)(valie或ready)和傳輸信息(data)進(jìn)行寄存,因此二者的資源消耗是沒(méi)有明顯區(qū)別的。因此我們還是要借助兩個(gè)寄存器

module dffse #(
	parameter WIDTH = 1
)(
	input 			clk,
	input 			rst_n,
	input  	[WIDTH -1:0]	d,
	input			en,
	output reg[WIDTH -1:0]	q
);
always @(posedge clk or negedge rst_n)begin
	if(~rst_n)  q <={WIDTH{1'b1}};
	else if(en) q <= d;
end
endmodule

module dffe#(
	parameter WIDTH = 1
)(
	input 			clk,
	input  	[WIDTH -1:0]	d,
	input	    		en,
	output reg[WIDTH -1:0]	q
);
always @(posedge clk)begin
	if(en) q <= d;
end
endmodule

這次用了dffse寄存器,說(shuō)白了就是復(fù)位值為全1寄存器,沒(méi)什么稀奇的。

那么對(duì)于ready打拍,關(guān)鍵點(diǎn)顯然就是data_in_ready的控制邏輯,不過(guò)這個(gè)邏輯不是太容易理解,所以咱們鏡像著data_in_valid的打拍來(lái)看。還記得fw_pipe中對(duì)data_in_valid打拍的方法么:

wire in_valid_en = data_in_ready;
wire in_valid_d  = data_in_valid;
wire in_valid_q;
dffre #(.WIDTH(1))
u_in_valid_dffre(
	.clk(clk),
	.rst_n(rst_n),
	.d(in_valid_d),
	.en(in_valid_en),
	.q(in_valid_q)
);
assign data_in_ready  = data_out_ready || (~in_valid_q);
assign data_out_valid = in_valid_q;

那咱們鏡像的來(lái)做bw_pipe中data_in_ready的邏輯應(yīng)該是:

wire out_ready_en = data_out_valid;
wire out_ready_d  = data_out_ready;
wire out_ready_q;
dffse #(.WIDTH(1))
u_out_ready_dffse(
	.clk(clk),
	.rst_n(rst_n),
	.d(out_ready_d),
	.en(out_ready_en),
	.q(out_ready_q)
);
assign data_out_valid = data_in_valid || (~out_ready_q);
assign data_in_ready = out_ready_q;

深深地感受下代碼的對(duì)稱之美!那么在fw_pipe中u_in_valid_dffre寄存的狀態(tài)是發(fā)送端是否有發(fā)送數(shù)據(jù)的請(qǐng)求,那么對(duì)應(yīng)的bw_pipe中u_out_ready_dffse寄存的狀態(tài)是什么呢?自然是接收端是否有接收數(shù)據(jù)的能力,因此這個(gè)寄存器的復(fù)位值應(yīng)該為1(就算上來(lái)下游就堵住了,pipe里至少能緩存一拍數(shù))。

因此當(dāng)該寄存器值為1時(shí)表明pipe內(nèi)是空的,為0時(shí)表示pipe內(nèi)有一筆數(shù),所以也就構(gòu)成了data_out_valid的一部分邏輯。

data_out_valid雖然是我們通過(guò)鏡像對(duì)稱得到的,但是也要理解所以然。當(dāng)out_ready_q == 0時(shí)表明pipe中有一筆數(shù)那么data_out_valid必然為1,此外無(wú)論out_ready_q什么狀態(tài)只要data_in_valid == 1那么也表明向下游傳輸?shù)臄?shù)據(jù)已經(jīng)準(zhǔn)備好了,data_out_valid也需要為1(對(duì)ready打拍,那么必然valid是存在bypass通路的。你想想在對(duì)valid進(jìn)行打拍時(shí),ready是不是有一條bypass通路)。

而out_ready_d = data_out_ready就需要感受一下了,如果這拍向下游握手成功了那么無(wú)論如何下一拍bw_pipe也是空的了。你結(jié)合data_out的邏輯一起品一品:

wire 		 data_en = data_in_valid && data_in_ready;
wire [WIDTH -1:0]data_d  = data_in;
wire [WIDTH -1:0]data_q;
dffe #(.WIDTH(WIDTH))
u_in_data_dffe(
	.clk(clk),
	.d(data_d),
	.en(data_en),
	.q(data_q)
);

assign data_out       = out_ready_q ? data_in : data_q;

如果當(dāng)拍out_ready_q == 0(bw_pipe內(nèi)有數(shù))則取走data_q,否則直接通過(guò)bypass通路取走data_in。那是不是意味著,只有對(duì)下游握手了,下一拍的bw_pipe中就一定沒(méi)有數(shù)了!

問(wèn)題解決啦,最后的代碼就完整的出來(lái)了呀:

module bw_pipe #(
	parameter WIDTH = 8)
(
	input clk,
	input rst_n,
	
	input [WIDTH -1:0]data_in,
	input 		  data_in_valid,
	output		  data_in_ready,
	
	output[WIDTH -1:0]data_out,
	output		  data_out_valid,
	input		  data_out_ready
);

wire out_ready_en = data_out_valid;
wire out_ready_d  = data_out_ready;
wire out_ready_q;
dffse #(.WIDTH(1))
u_out_ready_dffse(
	.clk(clk),
	.rst_n(rst_n),
	.d(out_ready_d),
	.en(out_ready_en),
	.q(out_ready_q)
);

wire 		 data_en = data_in_valid && data_in_ready;
wire [WIDTH -1:0]data_d  = data_in;
wire [WIDTH -1:0]data_q;
dffe #(.WIDTH(WIDTH))
u_in_data_dffe(
	.clk(clk),
	.d(data_d),
	.en(data_en),
	.q(data_q)
);

assign data_out_valid = data_in_valid || (~out_ready_q);
assign data_out       = out_ready_q ? data_in : data_q;
assign data_in_ready  = out_ready_q;

endmodule

當(dāng)然了我們會(huì)發(fā)現(xiàn)一個(gè)特性,bw_pipe不像fw_pipe那樣會(huì)至少對(duì)數(shù)據(jù)打一拍,bw_pipe在通路暢通時(shí)data_in_valid/data_in是直接bypass到下游的,而通路阻塞時(shí)才會(huì)將數(shù)據(jù)在bw_pipe中寄存。

最后仍然借助auto_testbench驗(yàn)證一下代碼:

圖片

圖片

聲明:本文內(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)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119814
  • 時(shí)序優(yōu)化
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    1446
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    優(yōu)化高速接口的時(shí)序裕量

    本文將對(duì)源同步定時(shí)如何優(yōu)化高速接口時(shí)序裕量進(jìn)行討論。時(shí)序預(yù)算是對(duì)系統(tǒng)正常工作所需時(shí)序參數(shù)或時(shí)序要求的計(jì)算。
    發(fā)表于 03-20 10:46 ?2617次閱讀
    <b class='flag-5'>優(yōu)化</b>高速接口的<b class='flag-5'>時(shí)序</b>裕量

    時(shí)序優(yōu)化發(fā)送打拍策略解析

    打拍是進(jìn)行時(shí)需優(yōu)化最常用和最簡(jiǎn)單的方式之一,不過(guò)握手型協(xié)議的打拍和通常的使能型協(xié)議是不同的。
    的頭像 發(fā)表于 12-04 10:23 ?671次閱讀
    <b class='flag-5'>時(shí)序</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>之</b>發(fā)送<b class='flag-5'>端</b><b class='flag-5'>打拍</b><b class='flag-5'>策略</b>解析

    【InTime試用體驗(yàn)】使用簡(jiǎn)易、策略選擇精確度高的一款時(shí)序優(yōu)化軟件

    解決FPGA時(shí)序優(yōu)化問(wèn)題的軟件。InTime 內(nèi)嵌學(xué)習(xí)引擎,可以智能分析FPGA設(shè)計(jì),為綜合和布局布線提供更優(yōu)的策略組合。同時(shí),根據(jù)對(duì)器件、設(shè)計(jì)和工具特點(diǎn)的了解,以及獨(dú)有的算法,InTime 可以生成最能滿足
    發(fā)表于 07-05 11:00

    幾個(gè)FPGA時(shí)序優(yōu)化簡(jiǎn)單技巧

    特定模塊劃分到不同的時(shí)鐘域里;但異步時(shí)鐘域不宜太多。綜合時(shí)使用retiming,duplication;physical synthesis優(yōu)化,現(xiàn)在的綜合器這方面已經(jīng)足夠聰明了。預(yù)算允許可使用速度更快的芯片;這個(gè)也許是實(shí)現(xiàn) “不修改RTL又時(shí)序收斂” 的最可能的方式。
    發(fā)表于 06-07 17:55

    靜態(tài)時(shí)序優(yōu)化策略有哪些?

    變則通,通則久。事物都有其運(yùn)行的規(guī)律,把握好規(guī)律,就能更好的實(shí)現(xiàn)人的目的。在數(shù)字后端設(shè)計(jì)中,時(shí)序優(yōu)化一直是關(guān)鍵問(wèn)題,尤其追求高頻高性能的設(shè)計(jì)中,時(shí)許問(wèn)題常常貫穿始終。大大小小二十幾個(gè)項(xiàng)目模塊后端工作
    發(fā)表于 12-10 07:37

    怎樣去設(shè)計(jì)SpaeeWire Codec接收時(shí)序?

    SpaceWire Codec接收是什么?怎樣去設(shè)計(jì)SpaeeWire Codec接收時(shí)序?時(shí)鐘域可劃分為哪幾個(gè)模塊?如何實(shí)現(xiàn)多時(shí)鐘域
    發(fā)表于 04-08 07:10

    FPGA設(shè)計(jì)應(yīng)用及優(yōu)化策略有哪些?

    EDA技術(shù)具有什么特征?FPGA是什么原理?FPGA設(shè)計(jì)應(yīng)用及優(yōu)化策略基于VHDL的FPGA系統(tǒng)行為級(jí)設(shè)計(jì)
    發(fā)表于 04-15 06:33

    你知道RTL時(shí)序優(yōu)化迭代的技巧有哪些嗎

    專項(xiàng)優(yōu)化,時(shí)序與門控精度的trade off。我優(yōu)化的模塊的一個(gè)典型的特點(diǎn)是低功耗要求很高,幾乎所有Always塊都會(huì)有綜合自動(dòng)生成的時(shí)鐘門控。由于時(shí)鐘樹(shù)長(zhǎng)差異和Setup要求更嚴(yán),時(shí)鐘門控的E
    發(fā)表于 06-23 15:43

    基于FPGA時(shí)序優(yōu)化設(shè)計(jì)

    現(xiàn)有的工具和技術(shù)可幫助您有效地實(shí)現(xiàn)時(shí)序性能目標(biāo)。當(dāng)您的FPGA 設(shè)計(jì)無(wú)法滿足時(shí)序性能目標(biāo)時(shí),其原因可能并不明顯。解決方案不僅取決于FPGA 實(shí)現(xiàn)工具為滿足時(shí)序要求而優(yōu)化設(shè)計(jì)的能力,還取
    發(fā)表于 11-18 04:32 ?3265次閱讀

    FPGA設(shè)計(jì)中層次結(jié)構(gòu)設(shè)計(jì)和復(fù)位策略影響著FPGA的時(shí)序

    FPGA設(shè)計(jì)中,層次結(jié)構(gòu)設(shè)計(jì)和復(fù)位策略影響著FPGA的時(shí)序。在高速設(shè)計(jì)時(shí),合理的層次結(jié)構(gòu)設(shè)計(jì)與正確的復(fù)位策略可以優(yōu)化時(shí)序,提高運(yùn)行頻率。
    發(fā)表于 02-15 15:15 ?991次閱讀

    時(shí)序分析的優(yōu)化策略詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是FPGA的時(shí)序分析的優(yōu)化策略詳細(xì)說(shuō)明。
    發(fā)表于 01-14 16:03 ?17次下載
    <b class='flag-5'>時(shí)序</b>分析的<b class='flag-5'>優(yōu)化</b><b class='flag-5'>策略</b>詳細(xì)說(shuō)明

    時(shí)序分析的優(yōu)化策略詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是FPGA的時(shí)序分析的優(yōu)化策略詳細(xì)說(shuō)明。
    發(fā)表于 01-14 16:03 ?19次下載
    <b class='flag-5'>時(shí)序</b>分析的<b class='flag-5'>優(yōu)化</b><b class='flag-5'>策略</b>詳細(xì)說(shuō)明

    如何降低面積和功耗?如何優(yōu)化電路時(shí)序?

    1、如何降低功耗? (1) 優(yōu)化方向: 組合邏輯+時(shí)序邏輯+存儲(chǔ) (2) 組合邏輯: ??(a)通過(guò)算法優(yōu)化的方式減少門電路 ??(b)模塊復(fù)用、資源共享 (3) 時(shí)序邏輯: ??(a
    發(fā)表于 02-11 15:30 ?2次下載
    如何降低面積和功耗?如何<b class='flag-5'>優(yōu)化</b>電路<b class='flag-5'>時(shí)序</b>?

    IC設(shè)計(jì)的特殊信號(hào)打拍方式及RR輪詢調(diào)度

    Axi總線打拍模塊通常會(huì)采用特殊設(shè)計(jì)的IP模塊,將所有axi總線信號(hào)互聯(lián)到axi打拍ip上,起到一個(gè)橋接的作用,能夠解決時(shí)序問(wèn)題。
    發(fā)表于 10-03 15:26 ?1312次閱讀

    在valid ready協(xié)議中對(duì)ready進(jìn)行timing修復(fù)打拍的方法

    首先將把目標(biāo)設(shè)計(jì)想象成一個(gè)黑盒子,如圖1所示,我們的目標(biāo)是將READY_DOWN通過(guò)打拍的方法獲得時(shí)序優(yōu)化。
    的頭像 發(fā)表于 06-27 16:20 ?1233次閱讀
    在valid ready協(xié)議中對(duì)ready進(jìn)行timing修復(fù)<b class='flag-5'>打拍</b>的方法