实用建模技术
1、过程连续赋值
1. assign 和 deassign:该结构目前被认为是很糟糕的编码风格,建议禁用。
deassign 表示一直保持被赋予的值,直到下一次改变。
module edge_dff
(
input wire d ,
input wire clk ,
input wire rst ,
output reg q ,
output reg qbar
);
always@(posedge clk)
begin
q = d ;
qbar = ~d ;
end
always@(rst)
begin
if( rst == 1'b1 )
begin
assign q = 1'b0 ;
assign qbar = 1'b1 ;
end
else
begin
deassign q ;
deassign qbar ;
end
end
endmodule
2. force release: 该结构目前被认为是很糟糕的编码风格,建议禁用。应当只出现在tb中。
module tb();
......
edge_dff(q,qbar,d,clk,rst) ;
......
initial
begin
#50
force
dff.q = 1'b1 ;
#50
release dff.q ;
end
endmodule
2、改写参数
defparam改写
module hello_world
(
.......
);
parameter id_num = 0 ;
endmodule
module top
(
......
);
defparam w1.id_num = 1 ;
defparam w2.id_num = 2 ;
hello_world w1();
hello_world w2();
endmodule
3、条件编译和执行
条件编译
//demo 1
`ifdef TEST
module test1(......);
......
endmodule
`else
module test2(......);
......
endmodule
`endif
//demo 2
module top ;
bus_master b1();
`ifdef ADD_B2
bus_master b2();
`elseif ADD_B3
bus_master b3();
`else
bus_master b4();
`endif
endmodule
条件执行
4、时间尺度
一般用于tb
`timescale 100ns/1ns
//100ns 表示 单位时间
//1ns 表示 时间精度
5、常用系统任务
1. 文件输出
打开文件: fopen
integer handl ;
handl = $fopen("demo1.out") ;
2、 写文件:fdisplay fmonitor fwrite fstrobe
integer decs1 ;
initial
begin
decs1 = 1'b1 ;
$fdisplay(decs1,"display 1") ;
end
3、 关闭文件:fclose
$fclose(handle1) ;
4、 显示层次:
module M();
initial
begin
$display("display in %m") ;
end
endmodule
module top();
M m1();
M m2();
M m3();
endmodule
5、 选通显示:strobe
strobe语句可以确保同一时刻执行完之后才显示数据
6、 随机数生成
$random ; 随机数生成器 是带符号的。
{$random} ; 加{}之后,为正数。
7、 存储器初始化
$readmemb("<file_name>",<memory_name>) ;
module tb();
reg [7:0] memory [0:127] ;
integer i ;
initial
beign
$readmemb("init.dat",memory) ;
end
endmodule
8、 值变转储文件
值变转储文件(Value conversion dump :VCD)是一个ASCLL文件,包含仿真时间,范围与信号的定义以及仿真过程中的信号变化。
initial
begin
$dumpfile("myfile.dmp") ;// 仿真信息存储到myfile.dmp
end
initial
begin
$dumpvars ; //没有说明指定变量的范围,代表所有信号
$dumpvars(1,top) ; //转储top中的信号,1表示转储top下的第一层
end
initial
begin
$dumpon ; //启动转储
#100000
$dumpoff ; //停止转储
end
initial
begin
$dumpall ; //生成一个检查点,转储所以VCD变量的当前值
end