1)过程赋值将值付给寄存器并保存,过程连续赋值可以有限时间内将表达式的值连续地加到寄存器或线网。
关键字assign和deassign表示第一类过程连续赋值语句。其左边智能是寄存器或一个拼接的寄存器组,不能是线网。可以改写常用的过程赋值的结果,只用于受控制的一段时间。
例如
//具有异步复位端,由下降沿出发的D触发器
module edge_dff(q,qbar,d,clk,reset)
output q,bar;
inout d,clk,reset;
reg q,qbar;
always @(negedge clk) //基于事件的时序控制,clk负向跳变执行always
begin
q=d;
qbar = -d;
end
always @(reset) //当reset为高电平时,执行always,过程连续赋值
if(reset)
begin
assign q=1'b0;
assign qbar = 1'b1;
end
else
begin
deassign q;
deassign qbar;
end
endmodule
这个方法不实用
force和release表示过程连续赋值语句的第二种形式,改写寄存器上的赋值也可以改写线网的赋值。主要是交互调试中使用应当只出现在激励中或调试语句中。
module stimulus;
...
//调用(实例引用)该触发器
edge_dff dff(Q,Qbar,D,CLK,RESET);
...
initial
begin
#50 force dff.q = 1'b1; //在时间单位50时刻,q强制赋值为1
#50 release dff.q; //时间单位100时刻,释放q的赋值
end
...
endmodule
force改写任何连续赋值语句所赋的值,直到释放线网。线网被释放是将立即返回自己的正常驱动值。
module top;
...
assign out = a & b & c; //用连续赋值语句对线网变量out赋值
...
initial
#50 force out =a | b & c;
#50 release out;
end
...
endmodule
2)改写覆盖参数
通过defparam语句或模块调用参数赋值或通过调用参数赋值
defparam在人员模块调用中改变数值,模块调用的层次名称可以用在改写参数值的语句中。
//定义模块
module hello_world;
parameter id_num = 0;
initial
$display("Displaying hello_world id number = %d",id_num);
endmodule
module top
//defparam语句,改变引用的实例模块中的参数值
defparam w1.id._num &