在RTL编码书写中如何考虑时延与布线的问题呢?

在rtl编码中考虑时延分if-else,case 的各种情况分开讨论,主要目的是将分支支路中 晚到的信号放到离输出最近的一级中.
对多if语句:代码
为下面代码为多if语句
module mult_if (a,b,c,d,sel,z) input a,b,c,d; input[3:0]sel; output z; reg z; always@(*) begin z=1'b0; if (sel[o])z=a; if (sel[1])z=b; if (sel[2])z =c; if (sel[3])z =d; endendmodule对应的硬件结构为有优先级的级联多路选择器
如果有个别信号到来的比较晚。应该要尽可能把这个延迟较大的分支单独拿出来,放到离出口最近的选择器中。假设b信号的延迟较大,可以在不影响逻辑功能的前提下,将b往后拉,如:
always@(*) begin z=1'b0; if (sel[o])z=a; if (sel[2])z =c; if (sel[3])z =d; // if (sel[1])z=b; if(sel[1]& ~(sel[2]|sel[3])) z = b_is_late; end此时如果仅将if (sel[1])z=b;直接放下会使原来的逻辑功能改变。修改后的电路:
对单if语句代码:
module single_if_late (a,c,ctrl_is_late_arriving,z):input [6:1]a:input [5:1]c;input ctrl_is_late_arriving:output z;reg z;always@(a or c or ctrl_is_late_arriving)begin if(c[1]==1'b1) z=a[1]; else if (c[2]==1'b0) z=a[2]; else if (c[3]==1'b1) z=a[3]; else if (c[4]==1'b1&ctrl_is_late_arriving==1'b0) z=a[4]; else if (c[5]==1'b0) z=a[5]; else z=a[6]; endendmodule其中 ctrl_is_late_arriving 到来延迟较大,此时就会把这个延迟较大的分支单独拿出来,放到离出口最近的选择器中:
具体的修改代码是这样的,先将原来的if打散,再在后面出口做一个选择,单独处理a[4]:
module single_if_improved (a,c,ctrl_is_late_arriving,z);input [6:1]a;input [5:1]c;input ctrl_is_late_arriving;output z;reg z,z1;wire z2,prev_cond;always@(a or c)begin if(c[1]==1'b1) z1=a[1]; else if (c[2]==1'b0) z1=a[2]; else if (c[3]==1'b1) z1=a[3]; else if (c[5]==1'b0) z1=a[5]; // removed the branch with the late_arriving control signal // else if (c[4]==1'b1&ctrl_is_late_arriving==1'b0) else z1=a[6];end assign z2=a[4]; assign prev_cond=(c[1]=1'b1)l(c[2]==1'b0)||(c[3]==1'b1); always @ (c or prev_cond or ctrl_is_late_arriving or z1 or z2) begin if((c[4]==1'b1)&&(ctrl_is_late_arriving==1'b0)) if(prev_cond) z=z1: else z=z2; else z=z1 ;endendmodulecase和if嵌套module case_in_if_01(a,data_is_late_arriving,c,sel,z);input[8:1] a;input data_is_late_arriving;input [2:0] sel;input [5:!] c;output z;reg z; always @ (sel or c or a or data_is_late_arriving) begin if (c[1]) z=a[5]; else if (c[2]==1'b0) z=a[4]; else if (c[3]) z=a[1]: else if (c[4]) case (sel) 3'b010:z=a[8]; 3'b011:z=data_is_late_arriving; 3'b101:z=a[7]: 3'b11o:z=a[6]; default:z=a[2]; endcse else if (c[5]==1'b0) z=a[2]; else z=a[3];endendmodule假设case中有一个支路到达比较晚,其电路结构为:
此时与单if相似,将这条通路往外提:
代码与单if-else结构的相似,去掉了case分支,单独判断这个分支:
module case_in_if_01(a,data_is_late_arriving,c,sel,z);input[8:1] a;input data_is_late_arriving;input [2:0] sel;input [5:!] c;output z;reg z,z1;reg first_if;always @ (sel or c or a or data_is_late_arriving) begin if (c[1]) z1=a[5]; else if (c[2]==1'b0) z1=a[4]; else if (c[3]) 1z=a[1]: else if (c[4]) case (sel) 3'b010:z1=a[8]; // 3'b011:z=data_is_late_arriving; 3'b101:z1=a[7]: 3'b11o:z1=a[6]; default:z1=a[2]; endcse else if (c[5]==1'b0) z1=a[2]; else z=a[3]; first_if=(c[1]==1'b1) || (c[2]==1'b0) ||(c[0]==1'b1); if(!first_if && c[4] &&(sel==3'b011)) z=data_is_late_arriving; else z=z1;endendmodule“先加后选”和“先选后加”注意“先加后选”和“先选后加”两种方法对数据通道延迟的影响,对以下代码:
module before(adress, ptr1,ptr2, b,control,count);input [7:o] ptr1, ptr2;input control: //control is late arrivingoutput [15:0] count:parameter [7:0] base=8'b1000000;wire [7:o] prt,offset;wire [15:0] addr; assign ptr = (control ==1'b1)?ptr1:ptr2;assign offset=base-ptr:assign addr = adress-{8'h00-offset};assign count=addr+b;endmodule这里是先选后加, 假设控制信号到达比较晚 ,则需要改为先加后选:
代码修改如下
assign offset1 = base-ptr1;//could be t(base,ptr)assign offset2 = base-ptr2; //could be f(base,ptr)assign addr1 = adress-{8'h00-offset1);assign addr2 = adress-{8'h00-offset2};assign count1=addr1+b;assign count2=addr2+b;assign count=(control==1'b1)?count1:count2;复制数据路径将control信号放到最后
调整计算顺序在下例中,包含一个加法器和比较器:
module cond_oper(a,b,c,d,z):parameter n=8;input [n-1:o] a,b,c,d; //a is late arrivingoutput [n-1:0] z;reg [n-1:o] z;always@(a,b,c,d) begin if(a+b< 24)z<=c; else z<=d;endendmodule假设a信号到来较晚,此时调整a的计算路径,原来的计算顺序为:
通过调整代码:
always@(a,b,c,d) begin if(a< 24-b)z<=c; else z<=d;enda将少过一个减法器,此时电路结构变为:
在rtl编码中考虑面积随着芯片工艺的进步和生产成本的降低,面积显得没有时序问题重要。减少设计面积可以成本降低、功耗降低,特別是对于fpga的设计,直接决定fpga的选型。一般综合过程中可以对面积进行优化,但在rtl编码中如果注意节约设计面积,往往可以达到事半功倍的效果。减少设计的面积估计设计使用资源的数量知道设计中那些部分占用了较大的面积(触发器,加法器,乘法器)触发器的资源估计触发器的数量:触发器的数量由功能决定,很难减少触发器的面积:比较好估计操作符优化所以优化目标大头放在 组合逻辑 中,其对应着rtl代码中的各种操作符 rtl代码屮的一个“+“可能对应着一个64位的加法器。以下这些操作符都可能产生较大的组合逻辑,使用时应加以重视,如“+”、“-”、“×”、“/”以及 条件语句的比较运算 。对于这些操作,首先应该 判断其必要性 ,是否能用更简单的运算代替。
比如考虑
if(aa+b+q) statement1;if(y2 >a+b+r) statement2;if(y3 >a+b+s)可以修改为:
sumsum+q) statement1;if(y2 >sum+r) statement2;if(y3 >sum+s)则可以减少两个不必要的加法器
多比特多比特的信号也往往会占用较大的资源,因为使用这些信号的操作都是对所有的比特进行的,相当于成倍使用资源,因此,对这类信号的操作也应重视。
应该看一看这个信号的所有比特是否都需要参与操作,如果不是,则可以只对需要的部分比特进行操作。
假设:
访问—ram的地址有8比特,而写入操作时从0开始,每隔32个地址写入一个值,地址的产生可以有两种写法。
addr <= addr + 32;和
addr[7:5] <= addr[7:5] + 1;addr[4:0] 如果可以在rtl编码阶段考虑代码可能对布线产生的影响,就可能避免最后出现无法布通的情况。
布线阶段,通常热点是一个影响布线质量的问题。
热点是指设计的功能需要在一个面积内占用大量的布线资源:
热点产生原因:rtl编码时使用了特定的结构,如很大的mux:
这种结构产生的热点,在综合的时候,导致的延迟是看不出来 只有到了布线阶段才能给看到它的负面影响。因此,我们在rtl阶段应该重视这种电路,及早发现可能在布线阶段产生的问题。如果设计的功能中确实需要采用大的mux,可以通过其他方式改变他的结构。其基本的思路是将一个大的mux分解为多级较小的mux。

开关电源电路10点总结
大数据的4个关键技术
乐视网被强制执行超3.7亿元
销售MS2602A MS2602A频谱分析仪MS2602A
机器人视觉大幅解放人工劳动力,提高自动化水平
在RTL编码书写中如何考虑时延与布线的问题呢?
三星Galaxy A90曝光采用升降式摄像头设计后置摄像头就是前置摄像头
Google终于推出了适用于Android版本的Maps的自定义汽车图标
5G网络存在危害吗
谷歌Pixel系列更新后手机崩溃,只是小概率事件吗
mcu主控和ACU辅控有什么区别
小天鹅滚筒洗衣机操作程序简单易上手 帮助解放母亲双手
人工智能与大数据分析以及区别的详细中文资料概述
怎么使用蓄电池良好办法
摩尔定律未来还能不能继续下去
北京联通携手华为成功部署和验证了5G承载专享通道解决方案
桌面式三工位弹簧压力试验机:精密测试的新标杆
一份CS230课程知识点的归纳总结,在Reddit上引发热议
创新解决方案--Freescale 让智能手表颠覆现实
为什么HANA在家庭视频网络中选择1394技术,而不是以太网