📅  最后修改于: 2021-01-11 14:46:45             🧑  作者: Mango
将值放在变量和网络上称为分配。有三种必要的形式:
分配有两个部分,右侧(RHS)和左侧(LHS),中间有一个等号(=)或一个小于等号(<=)。
Assignment Type | Left-hand Side |
---|---|
Procedural |
|
Continuous |
|
Procedural Continuous |
|
RHS可以包含任何计算结果为最终值的表达式,而LHS可以指示RHS值分配给的变量或网络。
过程分配发生在过程中,例如初始,始终,任务和函数,这些过程用于将值放置到变量上。该变量将保留该值,直到下一次分配给同一变量为止。
当在仿真期间仿真执行此语句时,该值将被放置到变量中。可以通过使用控制流语句(如if-else-if,looping和case语句机制)来修改和控制所需的方式。
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk)
count++;
变量声明分配
可以在声明变量时将初始值放在变量上。该赋值没有持续时间,并保留该值,直到对同一变量的下一个赋值发生为止。
注意:不允许将变量声明分配给数组。
module my_book;
reg [31:0] data = 32'hdead_cafe;
initial begin
#20 data = 32'h1234_5678; // data will have dead_cafe from time 0 to 20
end
endmodule
reg [3:0] a = 4'b4;
reg [3:0] a;
initial a = 4'b4;
如果在声明过程中以及在初始块中将变量初始化为0次(如下所示),则不能保证求值顺序,因此可以具有8'h05或8'hee。
module my_book;
reg [7:0] addr = 8'h05;
initial
addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // illegal
integer i = 0, j; // declares two integers i,j and 0 is assigned to i
real r2 = 4.5, r3 = 8; // declares two real numbers r2,r3 and are assigned 4.5, 8 resp.
time startTime = 40; // declares time variable with initial value 40
这用于将值分配给标量和矢量网络。只要RHS发生变化,它就会发生。
它提供了一种无需指定门的互连即可对组合逻辑进行建模的方法,并使使用逻辑表达式驱动网络变得更加容易。
// Example model of an AND gate
wire a, b, c;
assign a = b & c;
每当b或c改变其值时,将评估RHS中的整个表达式并使用新值进行更新。
净申报分配
这使我们可以对声明网络的同一条语句进行连续分配。
注意:只能进行一次声明分配,因为网络只能声明一次。
wire penable = 1;
这些是程序性语句,允许将表达式连续分配给变量或网络。这是两种类型。
1.分配deassign:它将覆盖对变量的所有过程分配,并使用与deassign相同的信号将其停用。
变量的值将保持不变,直到变量通过过程或过程连续赋值获得新值为止。
一个赋值语句的LHS不能是部分选择,位选择,或阵列参考,但它可以是一个变量或变量的组合。
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
2.强制释放:这些类似于分配deassign语句,但也可以应用于网络和变量。
LHS可以是网络的位选择,也可以是网络,变量或网络的部分选择,但不能引用数组和变量的位或部分。
在使用release关键字释放变量之前,force语句将覆盖对该变量所做的所有其他分配。
reg o, a, b;
initial begin
force o = a & b;
……….
release o;
end