用错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都按住不放不行吧?又试了下,目前的看法是:

  1. 他那个对是因为分了fetch instruction, decode和execute 3个阶段,而我是三合一的。
  2. clk++改clk = ~clk 省电路:-) 改完还对
  3. 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显示的对,不一定对。前面一大段都是废话。

posted @ 2021-12-25 10:40  Fun_with_Words  阅读(58)  评论(0编辑  收藏  举报









 张牌。