0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

时序优化之接收端打拍策略探讨

冬至子 来源:芯时代青年 作者:尼德兰的喵 2023-12-04 10:20 次阅读

这篇文章是探讨对接收端进行时序优化(即ready打拍,或称backward打拍)的方式。

ready本身是不携带任何随路信息的,但如果因此就觉得可以简单把ready打一拍来进行时序优化那就大错特错了,要不然可以试一试看看错的多离谱。

无论valid打拍还是ready打拍,都需要将控制信号(valie或ready)和传输信息(data)进行寄存,因此二者的资源消耗是没有明显区别的。因此我们还是要借助两个寄存器

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寄存器,说白了就是复位值为全1寄存器,没什么稀奇的。

那么对于ready打拍,关键点显然就是data_in_ready的控制逻辑,不过这个逻辑不是太容易理解,所以咱们镜像着data_in_valid的打拍来看。还记得fw_pipe中对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;

那咱们镜像的来做bw_pipe中data_in_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)
);
assign data_out_valid = data_in_valid || (~out_ready_q);
assign data_in_ready = out_ready_q;

深深地感受下代码的对称之美!那么在fw_pipe中u_in_valid_dffre寄存的状态是发送端是否有发送数据的请求,那么对应的bw_pipe中u_out_ready_dffse寄存的状态是什么呢?自然是接收端是否有接收数据的能力,因此这个寄存器的复位值应该为1(就算上来下游就堵住了,pipe里至少能缓存一拍数)。

因此当该寄存器值为1时表明pipe内是空的,为0时表示pipe内有一笔数,所以也就构成了data_out_valid的一部分逻辑。

data_out_valid虽然是我们通过镜像对称得到的,但是也要理解所以然。当out_ready_q == 0时表明pipe中有一笔数那么data_out_valid必然为1,此外无论out_ready_q什么状态只要data_in_valid == 1那么也表明向下游传输的数据已经准备好了,data_out_valid也需要为1(对ready打拍,那么必然valid是存在bypass通路的。你想想在对valid进行打拍时,ready是不是有一条bypass通路)。

而out_ready_d = data_out_ready就需要感受一下了,如果这拍向下游握手成功了那么无论如何下一拍bw_pipe也是空的了。你结合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;

如果当拍out_ready_q == 0(bw_pipe内有数)则取走data_q,否则直接通过bypass通路取走data_in。那是不是意味着,只有对下游握手了,下一拍的bw_pipe中就一定没有数了!

问题解决啦,最后的代码就完整的出来了呀:

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

当然了我们会发现一个特性,bw_pipe不像fw_pipe那样会至少对数据打一拍,bw_pipe在通路畅通时data_in_valid/data_in是直接bypass到下游的,而通路阻塞时才会将数据在bw_pipe中寄存。

最后仍然借助auto_testbench验证一下代码:

图片

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117722
  • 时序优化
    +关注

    关注

    0

    文章

    4

    浏览量

    1428
收藏 人收藏

    评论

    相关推荐

    优化高速接口的时序裕量

    本文将对源同步定时如何优化高速接口时序裕量进行讨论。时序预算是对系统正常工作所需时序参数或时序要求的计算。
    发表于 03-20 10:46 2457次阅读
    <b class='flag-5'>优化</b>高速接口的<b class='flag-5'>时序</b>裕量

    时序优化之发送端打拍策略解析

    打拍是进行时需优化最常用和最简单的方式之一,不过握手型协议的打拍和通常的使能型协议是不同的。
    的头像 发表于 12-04 10:23 375次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>优化</b>之发送端<b class='flag-5'>打拍</b><b class='flag-5'>策略</b>解析

    触摸屏知识及软件优化策略

    触摸屏知识及软件优化策略
    发表于 08-20 10:04

    【InTime试用体验】使用简易、策略选择精确度高的一款时序优化软件

    解决FPGA时序优化问题的软件。InTime 内嵌学习引擎,可以智能分析FPGA设计,为综合和布局布线提供更优的策略组合。同时,根据对器件、设计和工具特点的了解,以及独有的算法,InTime 可以生成最能满足
    发表于 07-05 11:00

    几个FPGA时序优化简单技巧

    特定模块划分到不同的时钟域里;但异步时钟域不宜太多。综合时使用retiming,duplication;physical synthesis优化,现在的综合器这方面已经足够聪明了。预算允许可使用速度更快的芯片;这个也许是实现 “不修改RTL又时序收敛” 的最可能的方式。
    发表于 06-07 17:55

    vivado:时序分析与约束优化

    能够有一些时序问题,我们再通过时序分析的方法对它进行优化。我们这里把原本的100M时钟改成了200M时钟,具体步骤如下: 一:更改时钟之后进行综合,并打开timing analysis 二:通过
    发表于 08-22 11:45

    静态时序优化策略有哪些?

    变则通,通则久。事物都有其运行的规律,把握好规律,就能更好的实现人的目的。在数字后端设计中,时序优化一直是关键问题,尤其追求高频高性能的设计中,时许问题常常贯穿始终。大大小小二十几个项目模块后端工作
    发表于 12-10 07:37

    怎样去设计SpaeeWire Codec接收时序

    SpaceWire Codec接收是什么?怎样去设计SpaeeWire Codec接收时序?时钟域可划分为哪几个模块?如何实现多时钟域
    发表于 04-08 07:10

    FPGA设计应用及优化策略有哪些?

    EDA技术具有什么特征?FPGA是什么原理?FPGA设计应用及优化策略基于VHDL的FPGA系统行为级设计
    发表于 04-15 06:33

    你知道RTL时序优化迭代的技巧有哪些吗

    专项优化时序与门控精度的trade off。我优化的模块的一个典型的特点是低功耗要求很高,几乎所有Always块都会有综合自动生成的时钟门控。由于时钟树长差异和Setup要求更严,时钟门控的E
    发表于 06-23 15:43

    时序分析的优化策略详细说明

    本文档的主要内容详细介绍的是FPGA的时序分析的优化策略详细说明。
    发表于 01-14 16:03 17次下载
    <b class='flag-5'>时序</b>分析的<b class='flag-5'>优化</b><b class='flag-5'>策略</b>详细说明

    时序分析的优化策略详细说明

    本文档的主要内容详细介绍的是FPGA的时序分析的优化策略详细说明。
    发表于 01-14 16:03 19次下载
    <b class='flag-5'>时序</b>分析的<b class='flag-5'>优化</b><b class='flag-5'>策略</b>详细说明

    如何降低面积和功耗?如何优化电路时序?

    1、如何降低功耗? (1) 优化方向: 组合逻辑+时序逻辑+存储 (2) 组合逻辑:   (a)通过算法优化的方式减少门电路   (b)模块复用、资源共享 (3) 时序逻辑:   (a
    发表于 02-11 15:30 2次下载
    如何降低面积和功耗?如何<b class='flag-5'>优化</b>电路<b class='flag-5'>时序</b>?

    IC设计的特殊信号打拍方式及RR轮询调度

    Axi总线打拍模块通常会采用特殊设计的IP模块,将所有axi总线信号互联到axi打拍ip上,起到一个桥接的作用,能够解决时序问题。
    发表于 10-03 15:26 1020次阅读

    在valid ready协议中对ready进行timing修复打拍的方法

    首先将把目标设计想象成一个黑盒子,如图1所示,我们的目标是将READY_DOWN通过打拍的方法获得时序优化
    的头像 发表于 06-27 16:20 796次阅读
    在valid ready协议中对ready进行timing修复<b class='flag-5'>打拍</b>的方法