| 
 | 
 
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册  
 
×
 
 本帖最后由 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模拟器看结果几乎是瞬间出现,这样是否合理?实际运行速度可能会怎样?实际设计中会怎样考虑这种计算? 
 
    
         
            - module SumNum(
 
 -         input clk,
 
 -         input [63:0] n,
 
 -         input n_next,
 
 -         output reg [63:0] result,
 
 -         output reg sum_done
 
 -     );
 
 -     reg[63:0] i = 1;
 
 -     wire [63:0] _i;
 
 -     assign _i = ~i;
 
 -   
 
 -     always @(_i, n_next)
 
 -     begin
 
 -         if (n_next == 0) begin
 
 -             i = 1;
 
 -             result = 0;
 
 -             sum_done = 0;
 
 -         end else begin
 
 -             if (i <= n) begin     
 
 -                 result = result + i;
 
 -                 i = i + 1;
 
 -             end else
 
 -                 sum_done = 1;
 
 -         end
 
 -     end       
 
 - endmodule
 
  
         
     
    复制代码  
2. i是reg变量,_i是对应的wire变量,如果计算部分用always @(i) 总是不计算,只能用@(_i), 难道always只对wire敏感?还是说不能对自己修改的变量敏感? |   
 
 
 
 |