📜  Verilog分配

📅  最后修改于: 2021-01-11 14:46:45             🧑  作者: Mango

Verilog分配

将值放在变量和网络上称为分配。有三种必要的形式:

  • 程序
  • 连续
  • 程序连续

合法的LHS值

分配有两个部分,右侧(RHS)和左侧(LHS),中间有一个等号(=)或一个小于等号(<=)。

Assignment Type Left-hand Side
Procedural
  • Variables (vector or scalar)
  • Bit-select or part-select of an integer, vector reg, or time variable.
  • Memory word.
  • Concatenation of any of the above.
Continuous
  • Net (vector or scalar)
  • Bit-select or part-select of a vector net.
  • Concatenation of bit-selects and part-selects.
Procedural Continuous
  • Variable or net (scalar/vector)
  • Part-select or bit-select of a vector net.

RHS可以包含任何计算结果为最终值的表达式,而LHS可以指示RHS值分配给的变量或网络。

程序分配

过程分配发生在过程中,例如初始,始终,任务函数,这些过程用于将值放置到变量上。该变量将保留该值,直到下一次分配给同一变量为止。

当在仿真期间仿真执行此语句时,该值将被放置到变量中。可以通过使用控制流语句(如if-else-if,loopingcase语句机制)来修改和控制所需的方式。

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