verilog是不是和c语言很相似?

开放10 回答 50 浏览

verilog是不是和c语言很相似?

分享:

10 个回答

  • 电路玩家新手

    语法上确实有点像,都是分号结尾、花括号包裹块、`//`注释这些表面功夫。但骨子里差太多了——C是过程式,一条条指令顺序执行;Verilog是硬件描述语言,你写的每个always块、assign语句在综合后都会变成实实在在的连线跟触发器,并行跑的。把Verilog当C写,综合出来大概率是一坨不可综合的仿真代码。

  • 新手程序员

    说实话,刚看完C再翻Verilog,很容易觉得亲切——一样的`if` `else`、`case`、`for`,连`++`运算符都有。可一旦开始写可综合的RTL,这种错觉就会害死人。C里你关心的是数据怎么流、函数怎么调,而Verilog里你脑子里必须时刻绷着一根弦:这段代码综合出来是什么电路?是组合逻辑还是时序逻辑?信号之间是并行赋值还是顺序赋值?

    举个常见坑:C里`a = b; b = c;`就是依次赋值,但在Verilog的always块里,如果你用的是阻塞赋值`=`,那它确实像C一样顺序执行;可一旦换成非阻塞赋值`<=`,所有赋值都在时钟沿同时发生。这个区别直接决定了你的电路是流水线还是串行。

    所以我的建议是:别贪图语法相似就跳过基础数字电路知识。先搞懂触发器、组合逻辑、时序逻辑这些硬件概念,再用Verilog去描述它们,而不是反过来试图用C的思维去理解Verilog。你现在是在学硬件描述语言,不是在学另一种C方言。

  • 单片机小白

    如果你只是翻翻代码,确实会觉得 Verilog 跟 C 长得像——分号结尾、花括号、注释符号都差不多。但实际写起来你会发现,C 是告诉计算机怎么算,Verilog 是告诉工具怎么连。我当初从 C 转过来,第一周写了个计数器,综合后发现多了一堆没用的锁存器,就是因为 always 块里没写全分支条件。所以我的建议是:别被语法相似骗了,先花点时间搞懂什么是寄存器传输级,什么是组合逻辑的敏感列表,这比记语法重要得多。你目前是在校上课还是自学起步?

  • 逻辑设计新人Leo

    相似仅限于词法层面,比如都用关键词 module 和 function,都有分号结尾,运算符也几乎一样。但语言模型完全不同:C 是顺序执行,一条语句等上一条跑完;Verilog 里同一个 always 块内的非阻塞赋值是同时触发的,不同 always 块之间更是完全并行。这个差异导致写 C 时你基本不用考虑硬件时序,而写 Verilog 每一步都得问自己——这个信号会不会产生竞争?这个组合逻辑会不会产生毛刺?我见过不少拿 C 思维写 Verilog 的人,最后代码仿真能过,但综合报告里全是 latch 警告和时序违例。一个可行的过渡方法是:先写最简单的组合逻辑(比如两个数相加),用 Modelsim 或 Vivado 看波形,亲眼确认赋值是同时完成的,等脑子里建立起并行执行的直觉,再写状态机或者复杂接口。另外建议尽早养成用非阻塞赋值的习惯,除非你明确知道自己在写组合逻辑。你手头有 FPGA 板子可以实测吗?没有的话用仿真工具看波形也行,效果比纯看书好很多。

  • CoderBegin

    说实话,语法上Verilog确实跟C有几分神似——分号结尾、花括号、`if` `else`、`for`循环,甚至`++`运算符都能用。但你要是真拿写C的思路去写Verilog,轻则仿真和综合结果对不上,重则板子冒烟都可能。我见过最典型的例子:有人用C里那种`a = b; c = a;`的顺序赋值习惯写always块,综合出一堆不是他想要的锁存器,还死活调不通。Verilog的核心不是你写了什么语句,而是这些语句综合出来是什么硬件:是触发器组、组合逻辑门,还是连线?你每写一行代码,心里都得问一句——这个信号在哪个时钟沿变化?它和别的信号是并行还是串行?学的时候建议先别急着写复杂功能,拿个简单的计数器或分频器,用仿真工具看波形,亲眼确认非阻塞赋值`<=`是在时钟沿同时生效的。等你脑子里能自动把代码映射成电路了,再去碰状态机或者接口协议。另外问一句,你目前是自学还是学校有课?如果自学,工具链是选Vivado还是Quartus?这个会影响初期上手路径。

  • 嵌入式爱好者小王

    如果你只是翻过几段Verilog代码,确实会觉得它跟C很像,甚至能直接猜出一些语法含义。但要是就此以为能像学C语言一样写Verilog,那基本会摔得很惨。C语言本质上是描述计算步骤:CPU一条条取指令、执行、写回结果,天然是顺序的。而Verilog是描述硬件结构:你写的每个always块、assign语句,综合工具都会把它翻译成真实的逻辑门和触发器,这些硬件是同时工作的。一个always块里写了两个非阻塞赋值,它们在同一个时钟沿同时发生,不存在谁先谁后。这个差异直接决定了调试方式也不同:C程序跑起来不对,你可以加打印、断点、单步执行,一步步看变量怎么变;Verilog代码行为不对,你得看波形,看信号在哪个时钟沿跳变、有没有竞争、组合逻辑有没有产生毛刺。很多从C转过来的人第一周都会栽在同一个坑里——always块里忘记写`else`分支,综合出一堆锁存器,仿真看着正常,上板子就乱跳。所以我的建议是:学Verilog之前,至少先把数字电路基础补一补,搞清楚触发器、组合逻辑、时序逻辑这些硬件概念,不用太深,但要知道它们怎么工作。然后写代码的时候,时刻提醒自己——这段代码综合出来是什么电路?信号之间是并行还是顺序?这比记语法细节重要得多。如果你现在还在校,建议先拿小脚丫或者黑金这类便宜开发板跑几个简单例程,用逻辑分析仪看实际波形,把仿真和真实硬件对应上。如果已经工作了,那更得注意代码风格的可综合性,别写出只有仿真才能通过的东西。你目前是在学习数字电路基础,还是已经上手写RTL了?这个阶段不同,我给的建议侧重点也会不一样。

  • 单片机学习中

    你这个问题其实是很多刚接触数字IC的人都会问的,尤其在学过C语言之后。从语法符号上看,Verilog确实跟C有几分像——分号结尾、花括号、`if else`、`for`循环这些都很眼熟。但如果你真拿写C的思路去写Verilog,很容易在仿真和综合之间摔跟头。C语言本质上是在描述一个顺序执行的过程:你写`a = b; c = a;`,CPU就是先算b再算a,一步一步来。而Verilog是在描述硬件结构——你写的每一个always块、assign语句,综合工具都会把它翻译成真实的逻辑门和触发器,这些硬件是同时工作的。同一个时钟沿下,非阻塞赋值`<=`会在所有信号准备好之后同时更新,不存在谁先谁后。这个差异直接决定了调试方式也不同:C程序跑起来不对,你可以加打印、断点、单步执行,一步步看变量怎么变;Verilog代码行为不对,你得看波形,看信号在哪个时钟沿跳变、有没有竞争、组合逻辑有没有产生毛刺。很多从C转过来的人第一周都会栽在同一个坑里——always块里漏写了else分支,综合出一堆锁存器,仿真时看着对,但实际电路跑起来完全不是那么回事。所以我的建议是:别被语法相似骗了,先花时间搞懂什么是寄存器传输级、什么是组合逻辑的敏感列表,这比记语法重要得多。你可以拿一个简单的计数器或者分频器练手,用Vivado或ModelSim看波形,亲眼确认非阻塞赋值是在时钟沿同时生效的。等你脑子里能自动把代码映射成电路了,再回头去看复杂的接口和状态机,会顺很多。你目前是在校上课还是自学起步?如果是在校,建议先吃透数字电路基础再碰Verilog,会少走很多弯路。

  • 芯片小菜鸟

    相似仅限于分号、花括号这些表面符号,骨子里一个是顺序执行的流程描述,一个是并行的硬件连线。把Verilog当C写,综合出来的大概率是一堆锁存器和时序违例。建议先搞清组合逻辑和时序逻辑的区别,再上手写代码。

  • 芯片学徒

    语法上确实像,分号、花括号、if-else都很眼熟,但写起来完全两码事。C是顺序执行,Verilog是并行硬件描述,你写个always块里的非阻塞赋值都是同时更新的,别拿C的思维去写,不然综合出来一堆锁存器。你是刚入门还是准备做项目?

  • 嵌入式学习ing

    个人感觉,问这个问题的人多半是C语言刚学完,看到Verilog的for循环和case语句觉得亲切。但相似真的只停留在纸面上。C语言里你写a=b; c=a;,下一步c得到的就是b的值。Verilog里你在always块用非阻塞赋值写同样的东西,c得到的是a的旧值,因为所有赋值在时钟沿同时拍下快照再更新。这个差异直接决定了调试方式不同:C可以加打印一步步看,Verilog得拉波形看时序。很多新手栽就栽在拿C的顺序思维去理解Verilog的并行更新。建议先别急着对比语法,拿个简单计数器写一写,在Vivado或Modelsim里看看波形,亲眼确认赋值是同时发生的,比背语法有效得多。你目前是在学数字电路基础还是直接上手写代码?

登录后可在本页底部提交回答

提问者

FPGA发烧友查看主页
浏览「技术分享」

描述场景与已尝试方案,更容易获得有效解答

相关问题

同分类

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位