在Verilog中,将force 用于variable会覆盖掉过程赋值 ,或者assign引导的连续(procedural assign)赋值 ,直到release 。
下面通过一个简单的例子展示其用法:
加法器代码
c
module adder
(
input logic [31:0] a,
input logic [31:0] b,
output logic [31:0] sum
);
//sum
assign sum = a + b;
endmodule
测试平台代码(主要用于产生激励)
cpp
module test;
logic [31:0] a;
logic [31:0] b;
logic [31:0] sum;
initial begin
forever begin
a = $urandom % 128;
b = $urandom % 128;
#10;
end
end
//
initial begin
#200
force u_adder.a = 32'd33;
force u_adder.b = 32'd66;
#200
release u_adder.a;
release u_adder.b;
end
initial begin
$fsdbDumpfile("adder.fsdb");
$fsdbDumpvars(0);
$fsdbDumpMDA();
end
initial begin
#1000
$finish;
end
//inst
adder u_adder
(
.a (a ),
.b (b ),
.sum(sum)
);
endmodule
如上所示,正常情况下,u_adder模块的a和b端口由testbench中的a和b信号驱动,然而,在时间为200ns处,u_adder模块的输入u_adder.a和u_adder.b被强制固定为33和66,如下代码所示。
cpp
#200
force u_adder.a = 32'd33;
force u_adder.b = 32'd66;
又经过200ns后,release语句释放了u_adder.a和u_adder.b的强制赋值,如下代码所示:
cpp
#200
release u_adder.a;
release u_adder.b;
编写makefile文件,对上述代码进行仿真,其中,makefile文件的内容如下:
cpp
all: listfile com sim verdi clean
listfile:
find -name "*.sv" > filelist.f
com:
vcs -full64 -cpp g++-4.8 -cc gcc-4.8 -LDFLAGS -Wl,--no-as-needed -sverilog -debug_access -timescale=1ns/10ps \
-f filelist.f -l com.log -kdb -lca
sim:
./simv -l sim.log +fsdb+force
verdi:
verdi -sv -f filelist.f -ssf *.fsdb -nologo &
clean:
rm -rf csrc *.log *.key *simv* *.vpd *DVE*
rm -rf verdiLog *.fsdb *.bak *.conf *.rc *.f
这里,在运行simv文件时,需要加上+fsdb +force选项,即:
cpp
./simv -l sim.log +fsdb+force
运行verdi查看波形,有下图:
可以看到,第200-400ns,加法器实际的输入a和b被固定为33和66,其值不再与testbench中的a, b绑定。另外,图中的紫色三角形分别表示该信号被force和release的时刻,被force强制指定的值,在显示的时候,前面会有一个^符号,例如上图中的^33 和^66。