网络推广哪家好互联网关键词优化
在Verilog中,将force用于variable会覆盖掉过程赋值,或者assign引导的连续(procedural assign)赋值,直到release。
下面通过一个简单的例子展示其用法:
加法器代码
module adder
(
input logic [31:0] a,
input logic [31:0] b,
output logic [31:0] sum
);
//sum
assign sum = a + b;
endmodule
测试平台代码(主要用于产生激励)
module test;logic [31:0] a;logic [31:0] b;logic [31:0] sum;initial beginforever begina = $urandom % 128;b = $urandom % 128;#10;endend//initial begin#200 force u_adder.a = 32'd33;force u_adder.b = 32'd66;#200release u_adder.a;release u_adder.b;endinitial begin$fsdbDumpfile("adder.fsdb");$fsdbDumpvars(0);$fsdbDumpMDA();endinitial begin#1000$finish;end//instadder 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,如下代码所示。
#200 force u_adder.a = 32'd33;force u_adder.b = 32'd66;
又经过200ns后,release语句释放了u_adder.a和u_adder.b的强制赋值,如下代码所示:
#200release u_adder.a;release u_adder.b;
编写makefile文件,对上述代码进行仿真,其中,makefile文件的内容如下:
all: listfile com sim verdi cleanlistfile:find -name "*.sv" > filelist.fcom: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+forceverdi: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选项,即:
./simv -l sim.log +fsdb+force
运行verdi查看波形,有下图:
可以看到,第200-400ns,加法器实际的输入a和b被固定为33和66,其值不再与testbench中的a, b绑定。另外,图中的紫色三角形分别表示该信号被force和release的时刻,被force强制指定的值,在显示的时候,前面会有一个^符号,例如上图中的^33和^66。