|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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模拟器看结果几乎是瞬间出现,这样是否合理?实际运行速度可能会怎样?实际设计中会怎样考虑这种计算?
- 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敏感?还是说不能对自己修改的变量敏感? |
|