本文描述了一个优化软核面积的RTL编码技术。优化掉不需要的逻辑,不仅减少了芯片面积,还减少了电路的开关活动,因此也减少了功耗。
\`ifdef,\`ifndef,\`elsif,\`endif结构如何帮助最小化面积?
以下是如何使用编译器指令最小化逻辑设计面积的示例:
`define MIN
module area_min_byifdef(in1,in2,in3,in4,out1) ;
input in1 ,in2 ,in3 ,in4;
output out1 ;
`ifdef MIN
assign out1 = in1 & in2 ; // minimal area
`else //large area
assign out1 = (in1 & in2) | (in3 ^ in4) ;
`endif
endmodule
使用编译器指令可以选择适当的模块。在以下代码中,使用编译器指令选择正确类型的计数器,即ripple 计数器和carry lookahead 计数器。
//`define CLA
module area_min_by_ifdef (a.b,c,sum,cout) ;
input a,b,c ;
output sum,cout ;
`ifndef CLA
ripple_adder U_ripple (
.in1(a) ,
.in2(b) ,
.in3(c) ,
.sum(sum) ,
.cout(cout)
) ; // smaller area , longer timing
`else
cla_adder U_cla (
.in1(a) ,
.in2(b) ,
.in3(c) ,
.sum(sum) ,
.cout(cout)
) ; // larger area , faster timing
`endif
endmodule
在上面的例子中,\`ifndef是指缺少CLA的\`define。
因此,使用这种方法中,来选择适当的代码去实现你的电路功能。
声明一些reg位,但不赋值和使用会发生什么?
当声明一些reg位,但不赋值和使用时,对应于那些位的逻辑会被优化掉。 例如,在下面的代码中,虽然声明了int\_tmp,但是2:1位是未使用的。 该代码将综合出int\_tmp [3]和int\_tmp [0]相关的逻辑, tmp [2:1] 相关的逻辑会被优化掉。
module lower(in1,in1,clk,reset,out1 );
input in1 ,in2 ;
input clk ,reset ;
output [1:0] out1 ;
reg [3:0] int\_tmp ;
always@(posedge clk or negedge reset) begin
if(!reset) int\_tmp <= 0 ;
else begin
//Only bits 0 and 3 are used .
//Bits [2:1] are not assigned
int\_tmp[0] <= in1 ;
int\_tmp[3] <= in2;
end
end
...
endmodule
本文转载自公众号:芯片数字实验室
原文链接:
https://mp.weixin.qq.com/s?\_\_biz=MzU4ODY5MzkzOA==&mid=2247484754&idx=1&sn=acf59805366f3f3dfb0839e8adcb213b&chksm=fdd9ad8fcaae2499f306e4180a0942437bb02c608c9bcb90c22224fbbbccb565b58ba4dd9b8a&scene=21#wechat\_redirect
未经作者同意,请勿转载!
推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏