用错assign的一个例子
试用Verilog中的=, <=和assign - 博客园 Synchronous sequential circuits do not process their Verilog statements in sequence within the always block. 我理解这句话的前提是用了<=而不是=。
在这个帖子里,我用了条assign,这是错的。程序能跑对是运气好,assign op = inst[7:6];后就不对了。op需要是最时新的inst[7:6],assign不能保证这点。恐怕时序电路里就不应该用assign. 补充: GitHub - robertdunne/FPGA-ARM: Verilog source code for book: Computer Architecture Tutorial 我可能说错了。他这个CPU用了assign和always @ (posedge(clk)),俺用的是level trigger. 见笑了,我外行。RS触发器好像level是不行的,起码R和S都按住不放不行吧?又试了下,目前的看法是:
- 他那个对是因为分了fetch instruction, decode和execute 3个阶段,而我是三合一的。
- clk++改clk = ~clk 省电路:-) 改完还对
- posedge(clk)和clk结果没区别
”恐怕时序电路里就不应该用assign. “的来历: MIT有个人强调"组合电路里多用assign",那我就想了:1. 保证没有未初始化的变量呗。2. 如果时序电路也多用,她为啥不直接说"电路里多用assign"?
在分析问题的过程中做了个小程序vvexplain.py. iverilog.exe生成的a.out, -o b.out, vvexplain.py < a.out后把%load/vec4 v0000022f59603ae0_0;之类换成了load "reset" 之类,看起来方便些。然后我没有diff和windiff, fc差强人意,于是在html里放了个两栏的表格自己对比。全部文件在这里。
vvexplain.py:
from sys import * import re import functools dic = {} while 1: s = stdin.readline() if s == '': break if s.startswith(('#', ':')): continue s = s.strip(); f = re.split('[ ,;]', s); if len(f) >= 2: if f[1] == '.var' or f[1] == '.net' or f[1] == '.array': dic[f[0]] = f[2]; continue if f[0].startswith('.') or f[1].startswith('.'): continue f = list(map(lambda x:dic.get(x, x).removesuffix('/vec4').removeprefix('%'), f)) print(' '.join(f))
HTML示意:
试了下op, ri, immd和s都用<=,以为可以,结果不行。原因:%store变%assign了,指不定啥时候才assign: The %assign/ar/e variation uses the information in the thread event control registers to determine when to perform the assign. 不好意思截图里体现的是在Verilog里写assign op = inst[7:6]的结果:上面的"汇编代码"有差异,有差异是表象是对的,因为.v代码就不同嘛。关键: op是inst的一部分,inst变了,op啥时候变?似乎要到仿真器的下一个step了。$monitor显示的对,不一定对。前面一大段都是废话。