task,repeat,defparam和条件编译示例,verilog高频高级语法1
1、task语法往往使用于较复杂的执行任务描述。实际使用时,只需要在相应使用的地方调用该函数即可代表把task内的语句又写了一遍。(黄四郎的帽子出现了,就代表黄四郎出现了)repeat语法相当于指定次数的循环。
task语法的使用范例:这里以模拟生成多次按键消抖为使用背景
task key_gen;
begin
key_out = 1'b1;
repeat(50)begin
myrand = {$random}%65536;//0~65535;
#myrand key_out = ~key_out;
end
key_out = 0;
#25000000;
repeat(50)begin
myrand = {$random}%65536;//0~65535;
#myrand key_out = ~key_out;
end
key_out = 1;
#25000000;
end
endtask
当需要调用这个任务时:
initial begin
key_out = 1'b1;
while(1)
begin
@(posedge key_press);
key_gen;
end
end
如上使用即可。
2、使用defparam函数,可以在上层模块中修改下层模块的指定参数。比如bin_counter工程中计数器计数1秒钟,需要仿真中时间过长,而在设计文件中修改计数器的计数值容易忘记改回来,从而人眼看不到周期1秒的闪烁而给自己板级验证时挖坑,此时,使用defparam函数在仿真文件中替换参数可以既加快仿真速度,又保持设计文件原封不动。指定被例化的模块内的参数,用法如下:
defparam bin_counter_inst.MCNT = 24_999_999;
bin_counter bin_counter_inst (
.clk(clk),
.reset_n(reset_n),
.led(led)
);
在bin_counter_inst模块中,参数正常使用即可,无其他改动,其代码如下:
module bin_counter
(
clk,
reset_n,
led
);
input clk;
input reset_n;
output led;
reg led;
wire reset;
assign reset=~reset_n;
parameter MCNT = 24_999_999;
3、条件编译用法。条件编译可以用于设计V文件之中,也可以用于tb文件之中。它的功能是可以结合使用实际情况,选择性的编译部分代码,让程序更灵活。实际使用时,只需要将编译条件给注释掉,就能够系统性的整体变换编译策略。
例如,在AC609开发板选择数码管模块的类型时,可以使用条件编译,在一套程序之中,迅速实现模块是段选位选还是SPI传输的选择实现。
将`define注释掉后,会得到不同的编译策略,解释如下:
当然,选择性的编译并不是只针对一处代码。在相同的设计文件中,可以反复使用`ifdef——`else——endif描述。
页:
[1]