我们都会听说Verilog等等HDL(Hardware Describe Language硬件描述语言)是并行执行的,可是又有if-else语句这种顺序执行的部分,那是不是自相矛盾呢?实际上,在行为描述语句里,有三种描述方式。行为级描述、数据流级描述和结构级描述。其中if-else过程性语句用于行为级描述,抽象程度较高,贴近于软件层面,适合我们初学者。以下详细解释来自chatgpt。
1. 行为级描述(Behavioral Description)
描述方式: 行为级描述是通过高级的控制语句(如 if-else
、case
、for
等)和过程块(如 always
、initial
等)直接描述电路的功能行为,而不关心具体的硬件实现细节。它更像是用 Verilog 写软件,设计者定义输入如何产生输出。
优点:
- 抽象程度高:设计者不必关心底层硬件的实现,集中精力描述功能逻辑。
- 代码简洁清晰:适合描述复杂的控制逻辑、状态机等,在有限的代码行数中实现复杂的功能。
- 易于仿真和验证:行为级代码往往更容易进行功能验证,调试周期较短。
- 适合初学者:因为它与编写软件程序的方式类似,初学者可以更快上手。
缺点:
- 不利于硬件优化:因为行为级描述没有指定具体的硬件结构,综合工具可能无法生成最优化的电路,资源消耗较大,性能可能不如手动优化的设计。
- 不直观的硬件实现:行为级代码中的一些高级语法结构在综合时,可能生成复杂的硬件电路,难以理解具体的硬件行为。
示例:
verilog
always @(posedge clk or negedge rst_n) begin if (!rst_n) data <= 0; else if (enable) data <= data_in; end
2. 数据流级描述(Dataflow Description)
描述方式: 数据流级描述通过逻辑表达式、布尔代数和连续赋值语句(assign
)来描述电路中信号的流动和组合逻辑。该方法强调信号之间的逻辑关系,而不是具体的实现细节。
优点:
- 更贴近硬件:数据流描述方式反映了信号如何在硬件中流动,设计者可以更好地控制逻辑生成。
- 综合效率较高:数据流描述比行为级更容易生成优化的硬件电路,适合资源较为有限的 FPGA 设计。
- 较好的灵活性:设计者可以通过布尔表达式控制电路的优化和资源使用情况,适用于组合逻辑的描述。
缺点:
- 抽象程度较低:相比行为级描述,需要更多的电路设计基础知识才能编写高效的代码。
- 不适合复杂的控制逻辑:虽然适合组合逻辑,但不适用于时序逻辑和状态机等复杂设计。
示例:
verilog
assign sum = a + b; assign carry = (a & b);
3. 结构级描述(Structural Description)
描述方式: 结构级描述使用基本的逻辑单元(如门、触发器等)和模块实例化,搭建出更大的系统。它是一种低层次的描述方法,类似于用硬件描述语言直接构建电路图。
优点:
- 完全控制硬件实现:结构级描述让设计者直接控制硬件模块的组合,确保设计的硬件结构符合需求。
- 优化空间大:可以手动优化资源的使用,例如通过实例化定制模块来减少 FPGA 中的 LUT 使用量或增加并行性。
- 适合硬件设计师:这种方式反映了硬件电路的实际结构,适合有丰富硬件经验的设计者。
缺点:
- 开发周期长:描述方式较为繁琐,描述一个复杂电路所需的代码量巨大。
- 不适合复杂逻辑的开发:因为它需要显式实例化和连接各个模块,描述复杂逻辑时工作量大。
- 可读性差:结构级描述对于复杂系统,代码会变得难以维护和调试。
示例:
verilog
and u1 (out_and, a, b); or u2 (out_or, a, b);
4. 各描述方式的适用场景
描述方式 | 适用场景 |
---|---|
行为级描述 | 复杂的控制逻辑、状态机、时序逻辑,或快速验证设计功能,适合控制复杂性高但逻辑简单的设计。 |
数据流级描述 | 组合逻辑电路、简单的信号处理电路,适合逻辑关系清晰的模块,特别是对性能和资源优化有要求的设计。 |
结构级描述 | 实现简单的门级逻辑、优化电路资源的设计,适合对硬件资源要求高、需要高性能优化且能手动掌控每个模块的设计。 |
5. 总结
- 行为级描述:抽象程度最高,开发速度快,适合复杂逻辑功能的开发和仿真,但硬件优化程度较低。
- 数据流级描述:适合描述组合逻辑电路,易于控制电路性能和资源消耗,是 Verilog 开发中常用的描述方式之一。
- 结构级描述:硬件映射最为直接,适合优化硬件资源,但代码复杂度高,开发周期较长。
根据不同的设计需求,通常可以综合使用多种描述方式。例如,对于复杂的控制逻辑部分可以用行为级描述,而对于需要高性能的计算模块,可以使用数据流或结构级描述来优化硬件资源。