在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4168|回复: 11

[求助] 这样计算累加是否合理?always后面必须跟wire?

[复制链接]
发表于 2017-1-31 19:33:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 steeven_lee 于 2017-2-8 15:45 编辑

-----------2/5少量修改代码全部使用阻塞赋值。
-----------2/8重新整理代码 vivado下面4种仿真结果都正确,唯独实现后时序模拟和上板跑用ILV debug看结果大很多,i比n会大一些,result更大,哪位能帮忙解释一下为什么会不准,怎么引入的误差,能否修正?写了一个用时钟边沿触发的逻辑可以正常工作,两者相比一个快但是不准,一个准但是很慢。在实现后模拟单步跟踪发现都是lut的一些操作,看不懂。
------------原文:

初学verilog, 计算1+2+....+N,两个问题:
1. 不用时钟,从vivado 2016.4模拟器看结果几乎是瞬间出现,这样是否合理?实际运行速度可能会怎样?实际设计中会怎样考虑这种计算?




  1. module SumNum(
  2.         input clk,
  3.         input [63:0] n,
  4.         input n_next,
  5.         output reg [63:0] result,
  6.         output reg sum_done
  7.     );
  8.     reg[63:0] i = 1;
  9.     wire [63:0] _i;
  10.     assign _i = ~i;
  11.   
  12.     always @(_i, n_next)
  13.     begin
  14.         if (n_next == 0) begin
  15.             i = 1;
  16.             result = 0;
  17.             sum_done = 0;
  18.         end else begin
  19.             if (i <= n) begin     
  20.                 result = result + i;
  21.                 i = i + 1;
  22.             end else
  23.                 sum_done = 1;
  24.         end
  25.     end      
  26. endmodule



复制代码

2. i是reg变量,_i是对应的wire变量,如果计算部分用always @(i) 总是不计算,只能用@(_i), 难道always只对wire敏感?还是说不能对自己修改的变量敏感?
发表于 2017-2-3 10:03:12 | 显示全部楼层
一般来说是不合理的,通常一个周期累加一次。
发表于 2017-2-3 14:17:11 | 显示全部楼层
回复 1# steeven_lee

从verilog语法上来说,没什么毛病。
从实际应用来说,这个代码没有意义,因为不具备可综合性。如果你学习verilog是做FPGA设计,建议可以先学习可综合风格的verilog,可以少走不少弯路。比如你这个问题,就没有人会去这么写。可综合风格的verilog仅仅只是verilog的一个小子集,但是对于做FPGA设计来说恰恰是用这个子集。到最后你会发现语言只是个工具而已,最重要的最难的其实是FPGA系统设计,不建议把大量时间花在不需要的语法的深究上。

回到你说的always@(*)的问题,按我的理解verilog语法里不存在对wire还是reg敏感,我觉得很有可能不同的编译器(模拟器/仿真器)对特定语句的解释都可能会不一样,所以还是要先学习可综合风格的verilog,保证代码在不同的工具下的执行一致。
发表于 2017-2-4 13:16:34 | 显示全部楼层
楼上说的是,感觉你代码很别扭,很不舒服的感觉。就拿你的两个always来说,一个用阻塞赋值,一个用非阻塞赋值,你这个应该是没法综合的,i 明显的多个驱动源
 楼主| 发表于 2017-2-5 19:46:53 | 显示全部楼层
发表于 2017-2-6 08:27:05 | 显示全部楼层
回复 1# steeven_lee


    一个小建议, 刚入门时,除了自己多动手写代码外,还要多看看别人写的可综合代码。
 楼主| 发表于 2017-2-8 15:13:39 | 显示全部楼层


回复  steeven_lee


    一个小建议, 刚入门时,除了自己多动手写代码外,还要多看看别人写的可综合代 ...
ltshan 发表于 2017-2-6 08:27



非常感谢,初次接触这个语言,还在学习中。
发表于 2017-2-8 19:53:42 | 显示全部楼层
组合逻辑,阻塞赋值,这只能仿真练习练习,不能综合去实用
 楼主| 发表于 2017-2-9 10:33:21 | 显示全部楼层


组合逻辑,阻塞赋值,这只能仿真练习练习,不能综合去实用
frank_chen203 发表于 2017-2-8 19:53


哦?我专门按照dogbear2245的建议看了可综合语法,没说组合逻辑不能综合啊,再去研究一下。。。。
哪里有官方文档给个明确限制列表?
发表于 2017-2-9 13:49:25 | 显示全部楼层
回复 9# steeven_lee 你理解得对,他说法有问题。组合逻辑,阻塞赋值,这些和可不可综合没有关系。

很显然阻塞赋值可以被综合,一个很明显的例子就是使用always描述组合逻辑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-12 06:19 , Processed in 0.022213 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表