📜  数据流建模

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

数据流建模

数据流建模利用定义电路工作的功能代替其门结构。

随着逻辑综合工具变得越来越复杂,数据流建模已成为一种流行的设计方法。该方法使设计人员可以专注于根据数据流优化电路。

数据流建模使用多个操作符,这些运算符作用于操作数以产生所需的结果。 Verilog提供大约30种运算符类型。数据流建模从输入到输出的数据流来描述硬件。

数据流建模风格主要用于描述组合电路。使用的主要机制是连续分配。

连续作业

将值分配给称为net的数据类型,该数据类型用于表示连续分配中电路元件之间的物理连接。分配给网络的值由使用操作数和运算符的表达式指定。

连续分配将替换电路描述中的门,并以更高的抽象级别描述电路。连续的赋值语句以关键字assign开始。

句法

连续分配的语法是

assign [delay] LHS_net = RHS_expression; 

LHS_net是一个或多个位的目标网络,而RHS_expression是各种运算符的表达式。

任何源操作数值发生任何更改,都会随时评估该语句,并将结果分配给延迟单元之后的目标网络。

  • Assign语句的LHS必须始终为标量或向量网络或串联。它不能是寄存器。
  • 连续语句始终是活动语句,这意味着如果RHS上的任何值发生更改,LHS都会自动更改。
  • 寄存器,网络或函数调用可以出现在分配的RHS中。
  • 只要其操作数之一发生变化,就对RHS表达式进行求值。然后将结果分配给LHS。
  • 可以在assign语句中指定延迟。

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;