明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 96811|回复: 0

VERILOG语法问题【汇总贴】

[复制链接]

27

主题

46

帖子

2427

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2427

荣誉管理论坛元老

QQ
发表于 2020-4-9 11:53:22 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Verilog知识点参考:书籍《FPGA至简设计原理与应用》第一篇FPGA基础知识第三章硬件描述语言Verilog


【问题1】:关于 data[31 -cnt0*8 -:8]的含义。
回复:MDY常用的数据选择语句  http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=937

【问题2】:关于数组的含义,即reg[7:0]  data[3:0]的含义。
回复:Verilog中数组的表示 http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=946

【问题3】:VERILOG中正负数、小数的表示方法。
回复:FPGA中正负数和定点小数的表示方法  http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=771


【问题4】:在设计文件中,如何确定信号是什么类型的?
回复:【技巧分享】在设计文件中,如何确定信号是reg型还是wire型?
http://fpgabbs.com/forum.php?mod ... =621&fromuid=100110
(出处: 明德扬论坛)

【问题5】:我设计了一个模块,并且模块命名为latch,为什么软件会提示错误。  
回复:latch是VERILOG关键词,不能用于自己设计的模块命名或者信号名。所以要注意关键词。


【问题6:ALWAYS不写ESLE表示保持原来的值】:下面是一个ALWAYS语句,当rst_n==1、a==1时,led的值是多少?
TIM图片20200506164808.png
回复:当rst_n==1,a==1时,上图中第3、第6和第9行都不满足条件,因此第4、7、10行的赋值语句都不会执行。也就是说led值没有改变。
         所以,时钟上升沿之后,led还会保持原来的值。如果原来的led等于0,之后也是0;原来等于1,之后也是等于1.

【问题7】左移和右移,空出的位置是补0吗?
答:是的。左移就是低位补0,右移就是高位补0。


【问题8】为啥begin后面加这个冒号,以前没见到过。
微信图片_20200807112226.jpg



答:begin后面加冒号,相当于这个begin end块起一个名字。起名字是做区分用,一般情况下,不对begin/end命名,所以这种写法很少见。


【问题9】在verilog中到底应不应该用for循环?
答:在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别。在Verilog中除了在Testbench中使用for语句外,在RTL级编码中是却很少使用for循环语句。主要原因就是for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效的复用逻辑资源,造成巨大的资源浪费。简单来说:for循环几次,就是将相同的电路复制几次,因此循环次数越多,占用面积越大,综合就越慢。

【问题10】在Verilog中想要给一个信号赋值的位宽是可变的,应该怎么做?
答:可以使用下面这个赋值方法:{WID{1'b1}}
举例:din <= {WID{1'b1}},当WID为8的时候,din <= 8'b1111_1111
通过修改WID的值,可使赋值的位宽发生变化。

【问题11】data[b+7:b]<=rx[a+7:a]
老师我想用for循环动态给data的区间赋值,但是报错说b不是常量怎么办?
答:verilog中不支持位宽选择时 上边界和下边界均为变量。另外:不要用软件的思维来做FPGA设计

【问题12】提示endmodule语法错误?这个能有什么错误呢?如下图:
32.jpg
答:像这种提示哪几种错误的,就打开代码,找到这一行,前前后后,检查代码有哪些与“平常”不一样的地方。如果 清楚,可以打开一个已经OK的代码,来代码下。

【问题13】请问以下变量后加个"-"意思是取这个变量的某几位吗?
9.JPG

答:上面的按减号带入结果就可以了,例如 data[7-1],就是data[6]。 data[7-1:0],就是data[6:0]。

【问题14】问能不能在适中的下降沿采集数据呢,比如写成always@(negedge clk)
答:整体系统中,建议都使用时钟上升沿,不要使用下降沿,否则不符合设计规范,造成系统的不稳定。
      FPGA系统会对全部路径进行路径分析,会计算两个D触发器之间的延时,确保这个时钟上升沿发出的数据,在下一个时钟上升沿能采到。
      假如上升沿发数据,下降沿来采集(或者下降沿发数据,上升沿采集),相当于时钟周期减半了,时序要求更高了。

【问题15】二进制000-二进制001=111  这个最高位怎么算的?
答:参考十进制加减的运算方法,如下图所示得到的。
TIM图片20200903181254.png
所不同的是:二进制是 0-0=0,0-1=1,1-0=1,1-1=0。
如果保存结果的位宽只保留最低位的话,那就是111。
更多更详细的资料,请看《FPGA至简设计原理与应用》:http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=989,请看第一篇,第三章5.3 算术运算符的内容。

【问题16】rst_n==1'b0 和!rst_n不同的问题。
111.jpg 112.jpg
LED灯设计为什么LED和计数器复位条件不一样?
答:这两个结果是一样的,都是当rst_n为1时复位。只是写法不同。

【问题17】请问各位老师同学 如何用modelsim获取一段代码的运行时间? 谢谢
答:verilog是硬件描述语言,不是软件。一般情况下,硬件的运行速度仅取决于系统时钟频率。但随着时钟频率的提高,关键路径成为制约硬件速度的瓶颈。至于最高速度,要基于具体的工艺库,并用DC、PT等专业软件做静态时序分析才能得出来。

【问题18】a[0:0]表示什么意思呢?
答:就是a[0]的意思

【问题19】data[0] <= data_b [0][2]表示什么意思?
答:将data_b看作一个矩阵,表示调用矩阵的第0行第2个数据。

【问题20:一个always里有多少信号时的理解问题】如下图所示,第9行代码里的key_reg值,是等于第8行的key的值还是key_reg的值。是先执行第8行,再执行第9行代码吗?
微信图片_20200911210716.png
答:当一个always里设计了多个信号时,如上图中设计了key_reg和delay_cnt的值,其实质可拆分成如下代码。
微信图片_20200911210724.png
而众所周知,verilog代码中每个always都是独立并且同时执行的。
因此上图中第23行的代码和第32行的判断是同时进行的。假设当前key_reg等于0。在时钟上升沿前key等于1。那么第23行执行后,key_reg值更新为1。同时第32行判断时key_reg值仍然为0,不是最新的值为1。
在此,MDY强烈建议,一个ALWAYS设计一个信号,有助于做逻辑设计,理清思路,避免很多理解上的问题。
而且事实上,一个always设计多个信号更像写“软件”的代码,是用软件思维在设计FPGA,而在FPAG中是不规范的。

【问题21】 always 语句中,不论是赋值 还是 比较,都是针对 时钟上升沿到来前的  前面一点点时刻的 寄存器中的数据 来赋值 和 比较的。
答:是的。具体请看下面的波形图规则 :http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=1006

【问题22】问一下关于敏感信号的事情,任何信号都可以被当作敏感信号吗?也就是always模块里面:always @(posedge din_vld or negedge rst_n)begin这样写可以吗?
答:语法上是可以的,但不符合FPGA和ASIC的设计规范。一般这个是写时钟和复位信号。不规范的话,会造成系统的不稳定

【问题23】复位信号必须要放到敏感信号列表吗?
答:异步复位需要将复位信号加到敏感列表,同步信号不需要

【问题24】怎么将信号实现准确的ns级别的延时呢,有什么好思路吗?
答:正规的做法,就是采用寄存器打拍来延迟,精度为一个时钟周期

【问题25】计数器分频怎么个不稳定法?
答:1. 时钟在FPGA里是非常重要的,所有的寄存器都是统一在时钟的节拍下工作。这个时钟就相当于一个军队的司令部,寄存器都听从司令部的命令下工作。      2. 一个稳定的系统,时钟是越少越好。就相当于,一个军队,司令部越少越好。如果司令部越多,那么部队之间的协作必须要增加流程和成本。
      3. 计数器分频的时钟,无形中增加了时钟个数,另一方面,就相当于弄一个自己独立的王国,自然就不稳定。

【问题26】多个模块的输出信号,可以连到一起,共同驱动另一个模块吗?
答:遇到此问题,可以稍微推理一下就能清楚了。例如模块A有一个输出信号a,模块B有一个输出信号b,然后这两个信号连在一起(怎么做的不清楚,先假充有这种情况),共同均有一个模块C的输入信号c。
      那么存在这种情况,模块A要输出1,模块B要输出0给模块C,那么模块C收到的是0还是1呢?这种情况下,模块C就不清楚收到什么了。
      所以本题答案:两个模块的输出信号不能连在一起。
【问题27】组合逻辑电路可以有反馈吗?
答:组合逻辑不可以有反馈的。组合逻辑根据当前输入得到输出,而这个输出信号不能与输入相连,如果相连了,那么输出的值就不确定了。

【问题28】写的代码太复杂/未遇到的语法,不理解/,代码不知道哪里错了/等问题
答:FPGA的代码格式都是非常简单的,不推荐也不建议使用复杂的语法。如果使用了使用语法,又出错时,有如下建议
     1. 将复杂代码,使用简单代码代替。
     2. 或者,将代码分解,每添加一行看不行结果,以方便定位哪里有问题。
【问题29】什么时候使用组合逻辑,什么时候使用时序逻辑?
答:请看此篇文章,有详细解释:http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=622

【问题29】VERILOG语法中,signed类型的作用。
答:1、在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,那么signed的修饰是为什么呢,是为了区分有符号数和无符号数的加法和乘法吗?其实不是的,因为有符号数和无符号数据的加法强结果和乘法器结构是一样的,signed的真正作用是决定如何对操作数扩位的问题。
2、verilog中的加法和乘法操作前,会先对操作数据扩位成结果相同的位宽,然后进行加法或者乘法处理。比如a/b都为4位数据,c为5位数据,c = a + b,这个运算的时候会先把a和b扩位成5位,然后按照无符号加法进行相加。a/b没有被signed修饰的时候会按照无符号数的扩位方式进行扩位,即高位补0,加法的结果当然也是a、b为无符号数相加的结果。
3、如果想把a、b作为有符号数来相加,那么就得在a/b数据定义的时候用signed修改,或者在计算的时候用$signed()来修饰,这样在c = a + b,这个运算开始的扩位就会按照有符号数的方式进行扩位,在高位补符号位,加法得出的结果就是a、b视为有符号数的结果。当然c要视为有符号数据。


【问题30】VERILOG中定义的类型,是怎么分辨是有符号数、无符号数、或者16进制数的。
      答:要真正理解一点,FPGA的信号,其本质上是二进制数。例如4'b1010。至于这个二进制数,是有符号数,还是无符号数,都是取决于工程师的解释。例如4'b1010,可以理解为无符号数10,也可以理解为有符号数原码-2,也可以理解为有符号数补码-6。更多解释,请看《FPGA至简原理与应用》一书中关于verilog和补码由来这一部分:http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=1117

【问题31】在FPGA计算中,对于a+b等,对a和b是根据无符号数,还是有符号数来计算的?
答:再次强调,真正理解:FPGA信号本质是二进制数。  无论a和b是什么类型的信号,最终都是换算成二进制来计算,自然的遵守二进制计算基本法则,具体请看:http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=1115

【问题32】请问generate的使用方法答:可以参考如下文章:07 generate语法http://www.fpgabbs.cn/forum.php? ... =269&fromuid=100782
(出处: 明德扬论坛)

【问题33】请问信号定义时,输出类型的定义和信号类型的定义可以放到一起写吗?
答:可以的,举例:  output   reg    [7:0] dout;

【问题34】len <= {len[7:0],din},len信号的位宽为16bit,din的位宽为8bit,这段代码的意思是什么?
答:举例说明,假设din需要传输的数据为8’h55和8‘hd5,len初始为16’h0,
则第一次进行赋值时,len[7:0]为8‘h0,din为8’h55,拼接之后赋值给len,此时len=16‘h0055;
第二次进行赋值时,len[7:0]为8’h55,din为8‘hd5,拼接之后赋值给len。此时len=16’h55d5。

【问题35】红色箭头指的那些语句是什么意思?
2.jpg 3.jpg
答:这是宏定义的的一种用法。此时表示该.v文件使用的是从“ 'ifndef SIMPLE”到“ 'endif”的代码,如果把“' define SIMPLE”注释掉的话,使用的就是除“ 'ifndef SIMPLE”到“ 'endif”以外的代码。



【问题36】好多个模块是只编译顶层模块就可以了吗?

答:无论是仿真还是综合,其综合都是从顶层模块开始的。通过调用顶层模块,然后根据顶层模块的例化代码,就能找到下一层模块,逐级找下去,就能找到所有使用到的模块了











上一篇:Verilog中数组的表示
下一篇:至简设计法问题【汇总贴】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号-1

GMT+8, 2020-10-23 01:20 , Processed in 0.534047 second(s), 16 queries , File On.

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表