搜索
bottom↓
回复: 28

verilog代码关于数据的有效方式的疑问

[复制链接]

出0入0汤圆

发表于 2013-12-6 11:15:07 | 显示全部楼层 |阅读模式
之前做仿真,数据都是时钟上升沿变化,那么数据有效则是下一个上升沿,我在状态机里都是利用上升沿控制数据、信号的有效。
但是再看仿真结果和signaltap抓的信号,对于边沿有效数据看着有点麻烦。
我感觉还是数据中央有效更能理解,比如地址、数据在上升沿的上一个下降沿准备好,这样就好理解多了。
那么这样修改后,是不是我的代码,例如状态机需要两个状态机来控制,一个是上升沿,另一个是下降沿控制来实现原有的功能。
不知说的有没有清楚,望解答!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-12-6 12:18:56 | 显示全部楼层
楼主没有做过后仿真吧?

出0入0汤圆

发表于 2013-12-6 13:28:14 | 显示全部楼层
楼上的做过后仿真???
Altera都不建议做后仿真的,后仿真是Gate级的了,常规做RTL级的前仿真就足够了。

另外,楼主的顾虑完全多余,同步时序电路的FPGA开发,不存在时钟下降沿的数据更新或变化问题,所有信号的状态变化均发生在rising_edge,下一个CLK的上升沿出结果,就这么简单

出0入17汤圆

发表于 2013-12-6 13:55:02 | 显示全部楼层
LZ去了解一下Setup time和Hold time吧,这才是真实世界的要求

出0入0汤圆

 楼主| 发表于 2013-12-6 14:17:02 | 显示全部楼层
本帖最后由 aikimi7 于 2013-12-6 14:30 编辑
msmotioncontrol 发表于 2013-12-6 13:28
楼上的做过后仿真???
Altera都不建议做后仿真的,后仿真是Gate级的了,常规做RTL级的前仿真就足够了。


嗯,之前都没有疑问。主要是最近用modelsim仿真,比如RAM,altera自动生成的时序图中,数据、地址、控制信号都不是时钟上升沿变化的,和仿真结果、抓取信号的结果有些差异,故有此疑惑!
但在仿真宏模块RAM时,在一个时钟沿,写使能拉高,同时数据、地址信号都改变,那么此时也应该是下一时钟完成写吗?

出0入0汤圆

 楼主| 发表于 2013-12-6 14:19:19 | 显示全部楼层
Nuker 发表于 2013-12-6 13:55
LZ去了解一下Setup time和Hold time吧,这才是真实世界的要求

这两在时序约束接触过,里面讲到源同步接口时也有提到center-aligned和edge-aligned

出0入0汤圆

发表于 2013-12-6 14:39:31 | 显示全部楼层
你的数据如果在上升沿变化,实际的变化因为存在延时,会发生在上升沿之后。
用上升沿来采这个数据是没有问题的,你用下降沿来采,逻辑上也没有问题,但最高频率会下降一半而已。如果全部用上升沿,你电路最快可以工作到100MHz,如果你上升沿、下降沿都用,简单来算就只能工作到50MHz了。

出0入0汤圆

发表于 2013-12-6 14:55:32 | 显示全部楼层
我的意思是,如果做后仿真的话,就能生动地看到 组合逻辑时延。楼主的这个问题我以前也有过。
其实在时钟周期逼近组合逻辑时延的时候,就能看到,在时钟上沿打出的数据,经过组合逻辑,一段时间之后稳定下来,然后下一个时钟上沿马上就来了。而中间的那个时钟下沿的时候,下一级的输入还处在混乱状态呢。
IC与IC之间,楼主的方法是对的。但IC内部,楼主的方法反而非常麻烦。时钟裕量小的时候,就完全没必要了。

出0入0汤圆

 楼主| 发表于 2013-12-6 14:58:57 | 显示全部楼层
sme 发表于 2013-12-6 14:39
你的数据如果在上升沿变化,实际的变化因为存在延时,会发生在上升沿之后。
用上升沿来采这个数据是没有问 ...

你说的第一点我能理解,也就是实际工作的真正状态。那是不是说逻辑分析仪抓的信号的结果和仿真结果也是一样的,都是边沿变化?
第二点,我利用一个周期内的上下沿准备和采集数据,并不影响速度,那么是不是说一个工程里最好只用上升沿,而不考虑下降沿呢?我感觉同时利用上下沿会提高效率和速度?

出0入0汤圆

 楼主| 发表于 2013-12-6 15:00:58 | 显示全部楼层
stdio 发表于 2013-12-6 14:55
我的意思是,如果做后仿真的话,就能生动地看到 组合逻辑时延。楼主的这个问题我以前也有过。
其实在时钟周 ...

我能理解你的意思。我可以利用一个周期的上下沿,但是一定要保证时序通过,对吧?

出0入0汤圆

发表于 2013-12-6 15:09:43 | 显示全部楼层
aikimi7 发表于 2013-12-6 14:17
嗯,之前都没有疑问。主要是最近用modelsim仿真,比如RAM,altera自动生成的时序图中,数据、地址、控制 ...

是的 你说的没错

出0入0汤圆

发表于 2013-12-6 15:13:19 | 显示全部楼层
aikimi7 发表于 2013-12-6 14:58
你说的第一点我能理解,也就是实际工作的真正状态。那是不是说逻辑分析仪抓的信号的结果和仿真结果也是一 ...

严禁你的硬件代码同时使用clk信号的上升沿及下降沿,这是工程上的常规,上升沿及下降沿同时使用不会获得速率的提升

出0入0汤圆

 楼主| 发表于 2013-12-6 15:32:33 | 显示全部楼层
本帖最后由 aikimi7 于 2013-12-6 16:01 编辑
msmotioncontrol 发表于 2013-12-6 15:13
严禁你的硬件代码同时使用clk信号的上升沿及下降沿,这是工程上的常规,上升沿及下降沿同时使用不会获得 ...


嗯,谢谢,受教了!
下面是ALTERA双端口RAM的仿真:

我的目的是地址0写入F0h,1写入F1h,2写入F2h,3写入F3h,图中写使能拉高的时钟沿,从q_a端输出我看到了数据07h,这说明了写使能在此时钟上升沿已经有效,且向地址0写入了07h?

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-12-6 15:58:35 | 显示全部楼层
本帖最后由 msmotioncontrol 于 2013-12-6 15:59 编辑
aikimi7 发表于 2013-12-6 15:32
嗯,谢谢,受教了!
下面是ALTERA双端口RAM的仿真:


我就你的截图进行下说明:

在图中,第二个CLK沿,【wren_a】被置为高电平,即Port A的写使能信号有效,此时采集到的【data_a】一定是0x07,而不是0xF0

你使用的双口RAM的IP核吧,好,RAM的IP核使不附加延迟的,那么一定是下一个时钟沿出你想要的结果

也就是,在第三个CLK沿,你从【q_a】看到了RAM的IP核输出的数据:0x07

不知我解释你是否清楚?

出0入0汤圆

发表于 2013-12-6 16:06:00 | 显示全部楼层
aikimi7 发表于 2013-12-6 14:58
你说的第一点我能理解,也就是实际工作的真正状态。那是不是说逻辑分析仪抓的信号的结果和仿真结果也是一 ...

效率和速度是两码事。

我说的是最高频率降低了。

如果电路本来是最高频率能够工作在100M,你这样用了会下降到50M。但你实际上的CLK<50M,你这样做是没错。

出0入0汤圆

 楼主| 发表于 2013-12-6 16:06:08 | 显示全部楼层
msmotioncontrol 发表于 2013-12-6 15:58
我就你的截图进行下说明:

在图中,第二个CLK沿,【wren_a】被置为高电平,即Port A的写使能信号有效, ...

嗯,我可以理解,谢谢!
我的问题是第二个上升沿,写使能拉高,不应该也是下一个时钟沿有效吗?不然为什么数据口却是下一个时钟沿有效?

出0入0汤圆

 楼主| 发表于 2013-12-6 16:40:33 | 显示全部楼层
本帖最后由 aikimi7 于 2013-12-6 16:41 编辑
msmotioncontrol 发表于 2013-12-6 15:58
我就你的截图进行下说明:

在图中,第二个CLK沿,【wren_a】被置为高电平,即Port A的写使能信号有效, ...


我调整了testbench中的语句,
initial begin
  
#15 begin addr_a = 5'd0; data_a = 8'hF0; wren_a = 1; end
#10 begin addr_a = 5'd1; data_a = 8'hF1;  end
#10 begin addr_a = 5'd2; data_a = 8'hF2;  end
#10 begin addr_a = 5'd3; data_a = 8'hF3;  end
  
#20 wren_a = 0;

end

仿真结果如下:

更令人纳闷了,改变即有效了,这才是功能仿真不考虑延时真正的结果吧?

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-12-6 17:11:17 | 显示全部楼层
aikimi7 发表于 2013-12-6 16:40
我调整了testbench中的语句,
initial begin
  

上面解释的不太对,那个07不应该写进去的;写进去的原因是你使用了“=”来赋值的,你应该使用“《=”来赋值;
这个时候在时钟的上升沿写信号是无效的,如果你看着波形难受,可以在仿真的时候加延时,“#1”来看;

这里,你混合使用了“=”和“《=”不推荐;

等待你的结果

出0入0汤圆

 楼主| 发表于 2013-12-6 17:31:34 | 显示全部楼层
jm2011 发表于 2013-12-6 17:11
上面解释的不太对,那个07不应该写进去的;写进去的原因是你使用了“=”来赋值的,你应该使用“《=”来赋 ...

应该都是下一个时钟沿有效,但如果是功能仿真的话,根据结果这时是有效的。就是下图所示:


我写的testbench,产生数据都是用的阻塞赋值,看来我这样处理存在问题,我在研究研究!

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-12-6 22:09:00 | 显示全部楼层
aikimi7 发表于 2013-12-6 16:06
嗯,我可以理解,谢谢!
我的问题是第二个上升沿,写使能拉高,不应该也是下一个时钟沿有效吗?不然为什 ...

第二个上升沿,写使能拉高,切记不是下一个时钟沿有效的,就是本时钟沿有效的!

这点初学者确实难以理解

出0入0汤圆

 楼主| 发表于 2013-12-6 22:09:10 | 显示全部楼层
本帖最后由 aikimi7 于 2013-12-6 22:11 编辑

研究了下,利用阻塞赋值写TB,数据在上升沿变化马上生效,如下图所示。


而利用非阻塞赋值,数据在下一个上升沿有效,如下图所示。


经过分析,第二种非阻塞方式和实际更接近,也和我之前signaltap抓信号的结果是一致的。
以前写TB都是直接阻塞赋值,没有考虑太多,下来再研究下行为级语言和TB的编写。
最后,还请高手赐教!

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2013-12-6 22:10:18 | 显示全部楼层
msmotioncontrol 发表于 2013-12-6 22:09
第二个上升沿,写使能拉高,切记不是下一个时钟沿有效的,就是本时钟沿有效的!

这点初学者确实难以理解 ...

我楼上的分析合理吗?

出0入0汤圆

 楼主| 发表于 2013-12-6 22:12:14 | 显示全部楼层
jm2011 发表于 2013-12-6 17:11
上面解释的不太对,那个07不应该写进去的;写进去的原因是你使用了“=”来赋值的,你应该使用“《=”来赋 ...

结果在19L

出0入0汤圆

发表于 2013-12-6 22:21:02 | 显示全部楼层
工程学代码编写风格中,只使用“《=”的,严禁使用“=”的

如果你用“=”,当然会出现你仿真看到的奇异结果了

这等效于VHDL中signal和variable的赋值区别

出0入0汤圆

 楼主| 发表于 2013-12-7 13:30:18 | 显示全部楼层
msmotioncontrol 发表于 2013-12-6 22:21
工程学代码编写风格中,只使用“《=”的,严禁使用“=”的

如果你用“=”,当然会出现你仿真看到的奇异结 ...

阻塞赋值在仿真时刻立即执行赋值;而非阻塞赋值在仿真时刻只更新RHS,在仿真结束时刻完成对LHS的赋值,因而该时刻的数据有效值仍为赋值前的值。
从这个角度理解,和实际电路情况就一致了(利用<=赋值)。

出0入0汤圆

发表于 2013-12-7 21:16:07 | 显示全部楼层
msmotioncontrol 发表于 2013-12-6 22:09
第二个上升沿,写使能拉高,切记不是下一个时钟沿有效的,就是本时钟沿有效的!

这点初学者确实难以理解 ...

苹果说的对,这个问题;以前我也是想了好长的时间;
最后的结论是,不能用软件的思想去理解verilog;
而应该想对应的电路才可以;就不会有这样的疑问了;

出0入0汤圆

发表于 2013-12-8 11:01:55 | 显示全部楼层
关于硬件开发,不论Verilog HDL,还是VHDL,都只是工具而已
阻塞赋值与非阻塞赋值也只是书本上的一个概念

真正的工程应用级项目开发需要长期大量的经验积累的,你写的代码是否可综合,这才是最重要的,仿真往往与FPGA真实的执行是有差别的,这点初学者会懵懂

所以,关键是硬件编程思想的行成…………

出0入0汤圆

发表于 2013-12-8 11:14:22 | 显示全部楼层
我指的【仿真往往与FPGA真实的执行是有差别的】
不是真的有差别,而是你试图用C程序的思路去做仿真,用纯软件的思想去分析硬件的执行而导致的仿真输入就有误,那仿真结果自然会出现偏差

出0入0汤圆

发表于 2013-12-8 20:34:15 | 显示全部楼层
msmotioncontrol 发表于 2013-12-6 22:21
工程学代码编写风格中,只使用“《=”的,严禁使用“=”的

如果你用“=”,当然会出现你仿真看到的奇异结 ...

testbench里,还区分这个?还有用非阻塞赋值的?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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