0%

RTL编码中考虑延时

列举了5个实例。

示例1:

假设b信号的延迟较大,到来较晚,那么电路应如何修改?

分析代码可知,当满足条sel[1]&~(sel[2]|sel[3])时,输出z=b。因此我们不可简单的移动if(sel[1]) z=b;语句的位置,否则会改变电路的功能。

RTL代码:

RTL2.1.png

电路结构:

RTL2.2.png

我们做如下修改:

1
2
3
4
5
6
7
8
always @(*)begin
z = 1'b0;
if (sel[0]) z = a;
if (sel[2]) z = c;
if (sel[3]) z = d;
if (sel[1] & ~(sel[2] | sel[3]))
z = b_is_late;
end

修改后电路结构为:

RTL2.3.png

示例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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];
end
endmodule

修改后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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];
else
Z1 = A[6];
end

assign Z2 = A[4];
assign prev_cond = (C[1]==1'b1)||(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;
end

endmodule

电路结构:

RTL2.4.png

示例3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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:1]C;

ouput 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'b110: Z = A[6];
default: Z = A[2];
endcase
else if (C[5] == 1'b0)
Z = A[2];
else Z = A[3];

end

endmodule

对应的电路结构:

RTL2.5.png

修改后:

RTL2.6.png

示例4:

信号CONTROL到达时间较晚,如何修改能够提高电路性能?

RTL2.7.png

如下修改,过复制数据路径,将CONTROL信号放到最后,通过先加后选的方式,改善选择信号的延时。

RTL2.8.png

调整后的代码:

RTL2.9.png

范例5:

假设A信号到来较晚,如何修改能够提高电路性能?

RTL2.10.png

修改方法:

通过调整A信号的计算顺序,是信号A路上减少了一个加法器。

RTL2.11.png

参考:芯动力—硬件加速设计方法

Thank you for your accept!
-------------本文结束感谢您的阅读-------------