首页 > 其他分享 >【Verilog入门】常见的可用于仿真不能综合成硬件的语句及其原因

【Verilog入门】常见的可用于仿真不能综合成硬件的语句及其原因

时间:2024-07-23 16:57:27浏览次数:12  
标签:语句 仿真 示例 不可 硬件 Verilog 综合

在 Verilog 设计中,不可综合的语句和结构主要是因为它们无法直接映射到实际的硬件实现。以下是详细的解释和每种不可综合语句或结构背后的原因:

1. 延迟控制语句 (#)

原因

  • 延迟控制语句用于仿真环境中引入时间延迟,但在实际硬件中没有直接对应的实现。
  • 硬件电路的操作是由时钟边沿触发的,而不是由精确的时间延迟控制的。

示例

always #10 clk = ~clk;  // 用于仿真,不可综合

2. 初始化块 (initial)

原因

  • initial 块在仿真开始时执行一次,用于设置初始条件,但硬件电路没有这样的初始条件设置机制。
  • 在实际硬件中,寄存器和存储器的初始状态通常是不确定的,或者通过复位电路来设置。

示例

initial begin
    a = 0;  // 仿真中的初始条件设置,不可综合
end

3. 系统任务和函数

原因

  • 系统任务和函数(如 $display$monitor$finish 等)用于仿真控制、调试和输出信息。
  • 在实际硬件中没有等效的机制来处理这些任务。

示例

$display("Simulation started");  // 仿真控制和调试,不可综合
$finish;  // 结束仿真,不可综合

4. 仿真时间控制

原因

  • 这些语句(如 $time$stime$realtime)用于获取当前仿真时间,在实际硬件中没有对应的实现。
  • 硬件电路的操作不依赖于获取当前时间,而是依赖于时钟信号。

示例

$time;  // 获取仿真时间,不可综合

5. 文件操作任务

原因

  • 文件操作任务(如 $fopen$fclose$fdisplay$fwrite)用于仿真期间的文件读写。
  • 在实际硬件中没有文件系统,因此无法实现文件操作。

示例

integer file;
file = $fopen("output.txt", "w");  // 文件操作,不可综合
$fclose(file);  // 文件操作,不可综合

6. 延迟控制的循环

原因

  • 在仿真中使用延迟控制语句结合循环可以模拟复杂的时间行为,但这些在硬件中没有对应的实现。
  • 硬件电路是并行操作的,不是通过循环和延迟来控制的。

示例

repeat (10) begin
    #5 clk = ~clk;  // 仿真中的时间延迟和循环,不可综合
end

7. 显示任务

原因

  • 显示任务(如 $display$write$strobe)用于输出仿真信息,帮助调试和验证。
  • 实际硬件中没有显示机制,这些信息输出无法实现。

示例

$display("Value of a: %d", a);  // 调试和验证,不可综合

8. 非合成的初值赋值

原因

  • 一些初值赋值在实际硬件中无法实现,尤其是在综合工具不支持初始化寄存器的情况下。
  • 在实际硬件中,寄存器和存储器的初始状态通常由复位电路设置,而不是通过初值赋值实现。

示例

reg [3:0] a = 4'b1010;  // 非合成的初值赋值,不可综合

9. 非标准的 Verilog 语法或扩展

原因

  • 有些 Verilog 语法或工具特有的扩展可能不被所有综合工具支持,导致无法综合。
  • 这些扩展通常是为了特定仿真工具的功能而设计的,而不是为了实际硬件实现。

示例

`define MY_MACRO 1  // 特定工具的扩展,可能不可综合

10. 行为级描述

原因

  • 高级行为描述(如复杂的计算或内存操作)在综合时可能需要重写为结构级描述,以映射到实际硬件。
  • 综合工具需要明确的硬件描述来生成相应的电路,而高级行为描述可能过于抽象,无法直接映射。

示例

for (i = 0; i < 16; i = i + 1) begin
    memory[i] = i;  // 高级行为描述,可能不可综合
end

总结

这些不可综合的语句和结构主要是因为它们在仿真环境中有特定的用途,但在实际硬件中没有对应的实现方式。为了确保代码可综合,设计时应避免使用这些语句,并专注于用结构级和RTL(寄存器传输级)描述硬件行为。如果需要在仿真中使用这些不可综合的语句,应将其限定在仅用于仿真的代码块中,并确保在综合时被忽略。

标签:语句,仿真,示例,不可,硬件,Verilog,综合
From: https://blog.csdn.net/m0_56800366/article/details/140640721

相关文章

  • C语言分支循环语句
    写博客太麻烦了,感觉要等转完专业之后才会写得多一点目前我知道c的分支有if,switchIf 的语句结构大致如下:if(3==3//判断,0为假,非0为真){//判断结果为真之后,运行的表达式printf("nb");}if语句中判断相等要用“==”,“=”表示赋值。除此之外多个条件可用elseif,else。e......
  • 嵌入式C语言之流程控制语句
    一、程序的执行顺序1、自上向下,自左向右执行二、流程控制语句作用1、控制程序的执行顺序--控制条件--执行内容三、流程控制语句的分类1、选择结构--2条2、循环结构--3条3、控制语句--4条四、选择结构1、if选择结构(1)如果小刚的考试成绩大于90分,给予奖励①......
  • 随机语句只给我 3 个输入
    我正在尝试制作一个RNG游戏,在其中滚动python语句。我应该有一个获得RNG的特殊机会。如果我编写任何超过3个rng的代码,则只会显示3个输入。我该如何解决?importrandomprint("roll.")rollwork=1whilerollwork==1:rolluse=input("yourolled.")......
  • 高级数据查询语句-多表联查
    一、多表联查        多表联查可以通过连接运算实现,即将多张表通过主外键关系关联在一起进行查询。1.内联查询        只有完全满足条件(主外键关系)的数据才能出现的结果1.1非等值查询         语法:非等值查询:SELECT*FROM表1,表2注意:  ......
  • 分支和循环语句
    目录一、选择结构 1.1、if语句(1)if语句(2)if-else语句(3)嵌套的if语句   1.2、关系、条件、逻辑操作符(1)关系运算符(2)条件运算符(3)逻辑运算符    1.3、switch语句二、循环结构2.1、while语句2.2、for语句2.3、do-while语句2.4、循环的嵌套三、无条件转向语......
  • Python入门知识点 5--流程控制语句
    先来分享一个pycharm使用小技巧   红色波浪线:提醒可能报错   黄色波浪线:提醒书写不规范,ctrl+alt+l去掉黄线   code--Reformatcode,就可以去掉黄线,调整代码格式1、程序三大执行流程(1)顺序执行        程序执行时,代码从上往下,从左往右执行,中间......
  • WCH-LinkW无线下载仿真调试器&无线串口通信(主/从机模式)-RISC-V/ARM内核MCU无线DAP下
    LinkW-1V1 主机 硬创社搜索(WCH-LinkW):WCH-LinkW无线下载仿真调试器-硬创社 板载PCB天线:2.4G板载天线AD库资源-CSDN文库简介: WCH-LinkW无线下载仿真调试器&无线串口通信(主/从机模式)。应用场景: 1、用于RISC-V/ARM内核MCU无线DAP下载仿真调试器2、......
  • 谈一谈一条SQL查询语句究竟是如何执行的?
    这里写目录标题理解执行流程衍生知识最后本篇文章是基于《MySQL45讲》来写的个人理解与感悟。理解先看下图:大体来说,MySQL可以分为Server层和存储引擎层两部分。就是对应着图中的两个圈。server层包含查询缓存、分析器、优化器、执行器等,以及及所有的内置函数(如......
  • 高级数据查询语句-多表联查
    一、多表联查        多表联查可以通过连接运算实现,即将多张表通过主外键关系关联在一起进行查询。下图提供了多表联查时用到的数据库表之间的关系。 1.内联查询         只有完全满足条件(主外键关系)的数据才能出现的结果 1.1 非等值联查    ......
  • Verilog程序模块最详细的说明-实现流水灯
    文章目录前言一、Verilog注释二、Verilog关键字三、Verilog模块1.Verillog的基本设计单元是**"模块"(block)**2.一个模块是由两部分组成,一部分是描述接口,另一部分描述逻辑功能.3.每个Verilog模块包括4个主要部分:4.举例-流水灯5.功能定义部分有三种方法:6.模块的调用......