📅  最后修改于: 2021-01-11 14:56:33             🧑  作者: Mango
数据流建模利用定义电路工作的功能代替其门结构。
随着逻辑综合工具变得越来越复杂,数据流建模已成为一种流行的设计方法。该方法使设计人员可以专注于根据数据流优化电路。
数据流建模使用多个操作符,这些运算符作用于操作数以产生所需的结果。 Verilog提供大约30种运算符类型。数据流建模从输入到输出的数据流来描述硬件。
数据流建模风格主要用于描述组合电路。使用的主要机制是连续分配。
将值分配给称为net的数据类型,该数据类型用于表示连续分配中电路元件之间的物理连接。分配给网络的值由使用操作数和运算符的表达式指定。
连续分配将替换电路描述中的门,并以更高的抽象级别描述电路。连续的赋值语句以关键字assign开始。
句法
连续分配的语法是
assign [delay] LHS_net = RHS_expression;
LHS_net是一个或多个位的目标网络,而RHS_expression是各种运算符的表达式。
任何源操作数值发生任何更改,都会随时评估该语句,并将结果分配给延迟单元之后的目标网络。
例
assign out1 = in1 & in2; // perform and function on in1 and in2 and assign the result to out1
assign out2 = not in1;
assign #2 z[0] = ~(ABAR & BBAR & EN); // perform the desired function and assign the result after 2 units
连续赋值表达式中的目标可以是以下之一:
让我们再来看一组示例,其中声明并使用了标量网络和矢量网络
wire COUNT, CIN; // scalar net declaration
wire [3:0] SUM, A, B; // vector nets declaration
assign {COUT,SUM} = A + B + CIN; // A and B vectors are added with CIN
注意:在同一目标网上不允许有多个连续赋值语句。
向量的连续分配
如特性中所述,可以在向量网上执行连续分配。
module adder(a,b,sum);
input [2:0] a,b;
output [3:0] sum;
assign sum = a + b;
$display("a = %b, b = %b, sum=%b", a,b,sum);
endmodule
上面的代码描述了一个3位加法器。和的MSB专用于携带上述模块。它生成以下输出:
a = 100, b = 111, sum = 1011 // (a = 4, b = 7, sum = 011, carry = 1)
向量和标量网络的级联也是可能的。通过连接显示3位加法器的相同示例:
module adder(a,b,sum);
input [2:0] a,b;
output [2:0] sum; //sum is a vector
output carry; // carry is a scalar
assign {carry,sum} = a + b; //assigning result to a concatenation of scalar and vector
$display("a = %b, b = %b, sum=%b, carry = %b", a,b,sum,carry);
endmodule
输出为:
a = 100, b = 111, sum = 011, carry = 1
1.定期连续分配
它遵循以下步骤,例如:
步骤1:声明网路。
步骤2:在网上写下一个连续的作业。
以下代码遵循常规连续分配:
wire out; // net 'out' is declared
assign out = a&b; //continuous assignment on declared net
2.隐式连续分配
声明后,我们还可以将连续分配放在网上。格式如下所示:
wire out = a & b; // net declaration and assignment together
3.隐式净声明
在Verilog中,在隐式分配过程中,如果声明了LHS,它将为所声明的网络分配RHS,但是,如果未定义LHS,它将自动为信号名称创建一个网络。
Wire in0, in1;
Assign out = in0 ^ in1;
在上面的示例中,未声明out ,但是Verilog对out进行了隐式的net声明。
在实际的硬件中,输入变化和相应的输出之间存在时间间隔。
例如,“与”门的延迟为2 ns,这意味着从更改输入时间起2 ns后,输出将更改。
延迟值控制在RHS操作数更改到将新值分配给LHS之间的时间。它类似于为门指定延迟。添加延迟有助于对简单电路中的时序行为进行建模。
它使我们更接近于模拟功能电路的实际情况。有多种方法可以指定连续赋值语句中的延迟,例如:
1.定期分配延迟
我们在连续分配语句中分配一个延迟值。延迟值在assign关键字之后指定。
当已经定义了LHS中的信号时,此延迟适用,并且该延迟表示更改已声明的网络值的延迟。例如,
Assign #10 out = in0 | in1;
如果RHS操作数有任何变化,则将在10个时间单位后评估RHS表达式,并将评估后的表达式分配给LHS。
在时间t,如果以上示例中的操作数之一发生变化,则表达式将以t + 10单位时间计算。
这意味着,如果in0或in1在10倍单位之前更改值,则考虑重新计算时(t + 10)的in1和in2的值。
2.隐式连续分配延迟
在这里,我们使用隐式连续分配来指定延迟和网络上的分配。
wire #10 out = in0 ^ in1; //implicit Continuous Assignment Delay.
与…相同
wire out
assign #10 out = in0 ^ in1;
3.净申报延迟
在这种情况下,延迟与网络而不是分配相关。
在这里,在声明网络而不添加连续分配时增加了延迟。
wire #10 out;
assign out = in;
此代码具有与以下相同的效果:
wire out
assign #10 out = in;