数据流建模

17 Mar 2025 | 5 分钟阅读

数据流建模使用定义电路工作原理的函数,而不是它的门结构。

随着逻辑综合工具变得越来越复杂,数据流建模已经成为一种流行的设计方法。这种方法允许设计者专注于根据数据流优化电路。

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

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

连续赋值

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

连续赋值替换了电路描述中的门,并在更高的抽象级别上描述电路。 连续赋值语句以关键字 assign 开头。

语法

连续赋值的语法是

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

该语句在任何源操作数值更改时进行评估,结果在延迟单元之后分配给目标网络。

  • assign 语句的 LHS 必须始终是标量或向量网络,或级联。 它不能是寄存器。
  • 连续语句始终是活动语句,这意味着如果 RHS 上的任何值发生变化,LHS 会自动发生变化。
  • 寄存器或网络或函数调用可以出现在赋值的 RHS 中。
  • 每当 RHS 中的一个操作数发生变化时,都会评估 RHS 表达式。 然后将结果分配给 LHS。
  • 可以在 assign 语句中指定延迟。

示例

连续赋值表达式中的目标可以是以下之一

  1. 标量网络
  2. 向量网络
  3. 向量的常数位选择
  4. 向量的常数部分选择
  5. 以上任何一项的级联

让我们再举一组例子,其中声明和使用标量和向量网络

注意:不允许在同一目标网络上使用多个连续赋值语句。

向量上的连续赋值

如特性中所述,连续赋值可以在向量网络上执行。

上面的代码描述了一个 3 位加法器。 总和的 MSB 专门用于在上述模块中进位。 它生成以下输出

向量和标量网络的级联也是可能的。 通过使用级联显示了 3 位加法器的相同示例

输出是

a = 100, b = 111, sum = 011, carry = 1 

1. 规则连续赋值

它遵循以下步骤,例如

步骤 1:声明网络。

步骤 2:在网络上编写连续赋值。

下面的代码遵循规则连续赋值

2. 隐式连续赋值

我们也可以在声明网络时在网络上放置一个连续赋值。 格式如下所示

3. 隐式网络声明

在 Verilog 中,在隐式赋值期间,如果声明了 LHS,它将把 RHS 分配给声明的 net,但如果未定义 LHS,它将自动为信号名称创建一个网络。

在上面的例子中,out 未声明,但 Verilog 为 out 进行了隐式网络声明。

延迟

在现实世界的硬件中,输入的变化和相应的输出之间存在时间间隔。

例如,AND 门中的 2 ns 延迟意味着输出将在输入更改后的 2 ns 后更改。

延迟值控制 RHS 操作数中的更改与新值分配给 LHS 之间的时间。 它类似于指定门的延迟。 添加延迟有助于对简单电路中的时序行为进行建模。

它使我们更接近于模拟实际运行电路的实际情况。 有多种方法可以在连续赋值语句中指定延迟,例如

1. 常规赋值延迟

我们在连续赋值语句中分配一个延迟值。 延迟值在 assign 关键字之后指定。

当 LHS 中的信号已经定义时,此延迟适用,并且此延迟表示更改已经声明的网络的延迟。 例如,

如果 RHS 操作数有任何更改,则 RHS 表达式将在 10 个时间单位后进行评估,并且评估后的表达式将分配给 LHS。

在时间 t,如果在上面的例子中其中一个操作数发生变化,那么表达式会在 t+10 个时间单位计算出来。

这意味着如果在 10 个时间单位之前 in0 或 in1 改变了值,那么会考虑在重新计算时 (t+10) in1 和 in2 的值。

2. 隐式连续赋值延迟

在这里,我们使用隐式连续赋值来指定网络上的延迟和赋值。

与以下相同

3. 网络声明延迟

在这种情况下,延迟与网络相关联,而不是与赋值相关联。

在这里,添加了延迟当网络被声明但没有放入连续赋值的时候。

这段代码与以下代码具有相同的效果


下一个主题门级建模