CHANG 发表于 2010-6-26 00:59:17

提高模拟效率的编码风格

本帖最后由 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调用非常影响模拟速度,不要滥用。

CHANG 发表于 2010-6-26 02:02:58

没人顶啊, 我来<br>
&nbsp; &nbsp;&nbsp;&nbsp;支持

interige 发表于 2010-6-26 04:00:23

我来顶,支持原创

longt 发表于 2010-6-26 04:48:57

支持,lz加油!

Sunlife 发表于 2015-6-17 09:31:18

                支持
页: [1]
查看完整版本: 提高模拟效率的编码风格