提高模拟效率的编码风格
本帖最后由 fpgaw 于 2010-7-16 11:10 编辑多条件下尽量使用 case 语句,不使用嵌套 If-else if-else if 语句
多条件组合逻辑可以用case语句描述,也可以用if-else if嵌套描述。使用case比if要快,两者占用内存差不多。
模拟速度较慢的写法
if (sel == 3'd0) y = i;
else if (sel == 3'd1) y = i;
else if (sel == 3'd2) y = i;
else if (sel == 3'd3) y = i;
else if (sel == 3'd4) y = i;
else if (sel == 3'd5) y = i;
else if (sel == 3'd6) y = i;
else if (sel == 3'd7) y = i;
模拟速度较快的写法
always @(i or sel)
case (sel)
3'd0: y = i;
3'd1: y = i;
3'd2: y = i;
3'd3: y = i;
3'd4: y = i;
3'd5: y = i;
3'd6: y = i;
3'd7: y = i;
endcase
不要使用多余的begin-end
我们都知道,在always或if-else中,多条语句要用begin-end包起来。如果只有一条语句,也用begin-end包起来,虽然不是错误的用法,但会影响模拟的速度,而且占用内存更多。
你不要这样写
always @(posedge clk or posedge rst)
begin
if (rst == 1) begin
q = 0;
end
else begin
q = d;
end
end
应该这样写
always @(posedge clk or posedge rst)
if (rst == 1) q = 0;
else q = d;
特别是在修改代码的时候,如果原来的begin-end块中已经改得只省一条语句了,那么就把 begin-end本身也删掉。
时钟产生行为级的很快
在测试程序中经常要产生时钟信号,使用always语句描述可以得到最好的模拟速度。
reg clk; // driven by a procedural block
initial clk = 0;
always // free running behave clk #1
#(`cycle/2) clk = ~clk;
避免把赋值语句分散到过多的always组中
对于多条赋值语句,描述时可以把它们写到一个always块中,也可以分到多个 always块中。例如描述寄存器时,可以每个寄存器写一组 always语句,也可以把所有的寄存写到一个always语句中。但是多个always块会降低模拟速度。
因此,如果能写成
always @(posedge clk) begin
b <= a;
c <= b;
d <= c;
e <= d;
end
就不要写成
always @(posedge clk) begin
b <= a;
end
always @(posedge clk) begin
c <= b;
end
always @(posedge clk) begin
d <= c;
end
always @(posedge clk) begin
e <= d;
end
尽量减少模块的端口数
模块端口数目越多,模拟速度越慢。因此应该对设计进行合理划分,减少模块连接的信号数。
尽量减少设计层次
设计层次越多,模拟速度越慢。
parameter比define占用内存
对于常量,编码时可以用`define定义宏,也可以用parameter定义参数。两者的模拟速度相当,但parameter要占用更多的内存。
`timescale精度高的速度慢
`timescale的精度越高,模拟速度就越慢,占用内存就越多。因此`timescale不应随意设置。
不要滥用$time系统调用
我们喜欢在testbench中使用$time系统调用来打印时间,非常方便,但$time调用非常影响模拟速度,不要滥用。 没人顶啊, 我来<br>
支持 我来顶,支持原创 支持,lz加油! 支持
页:
[1]