debug.vhd
来自「sparc org, vhdl rtl code」· VHDL 代码 · 共 832 行 · 第 1/3 页
VHD
832 行
if (rs1 = "00000") or (rs2 = "00000") then
if rd /= "00000" then
return(tostf(insn.pc) & bb & "mov" & bl2
& regimm(insn,hex,false) & ", %asr" & tost(rd));
else
return(tostf(insn.pc) & bb & "mov" & bl2 & regimm(insn,hex,false) & ", %y");
end if;
else
if rd /= "00000" then
return(tostf(insn.pc) & bb & "wr " & bl2 & "%asr"
& regimm(insn,hex,false) & ", %asr" & tost(rd));
else
return(tostf(insn.pc) & bb & "wr " & bl2 & regimm(insn,hex,false) & ", %y");
end if;
end if;
when WRPSR =>
if (rs1 = "00000") or (rs2 = "00000") then
return(tostf(insn.pc) & bb & "mov" & bl2 & regimm(insn,hex,false) & ", %psr");
else
return(tostf(insn.pc) & bb & "wr " & bl2 & regimm(insn,hex,false) & ", %psr");
end if;
when WRWIM =>
if (rs1 = "00000") or (rs2 = "00000") then
return(tostf(insn.pc) & bb & "mov" & bl2 & regimm(insn,hex,false) & ", %wim");
else
return(tostf(insn.pc) & bb & "wr " & bl2 & regimm(insn,hex,false) & ", %wim");
end if;
when WRTBR =>
if (rs1 = "00000") or (rs2 = "00000") then
return(tostf(insn.pc) & bb & "mov" & bl2 & regimm(insn,hex,false) & ", %tbr");
else
return(tostf(insn.pc) & bb & "wr " & bl2 & regimm(insn,hex,false) & ", %tbr");
end if;
when JMPL =>
if (rd = "00000") then
if (i = '1') and (simm = "0000000001000") then
if (rs1 = "11111") then
return(tostf(insn.pc) & bb & "ret");
elsif (rs1 = "01111") then
return(tostf(insn.pc) & bb & "retl");
else
return(tostf(insn.pc) & bb & "jmp" & bl2 & regimm(insn,dec,true));
end if;
else
return(tostf(insn.pc) & bb & "jmp" & bl2 & regimm(insn,dec,true));
end if;
else
return(tostf(insn.pc) & bb & "jmpl" & bl2 & regres(insn,dec));
end if;
when TICC =>
return(tostf(insn.pc) & bb & 't' & branchop(insn) & bl2 & regimm(insn,hex,false));
when FLUSH =>
return(tostf(insn.pc) & bb & "flush" & bl2 & regimm(insn,hex,false));
when RETT =>
return(tostf(insn.pc) & bb & "rett" & bl2 & regimm(insn,dec,false));
when RESTORE =>
if (rd = "00000") then
return(tostf(insn.pc) & bb & "restore");
else
return(tostf(insn.pc) & bb & "restore" & bl2 & regres(insn,hex));
end if;
when SAVE =>
if (rd = "00000") then
return(tostf(insn.pc) & bb & "save");
else
return(tostf(insn.pc) & bb & "save" & bl2 & regres(insn,dec));
end if;
when FPOP1 =>
case opf is
when FITOS => return(tostf(insn.pc) & bb & "fitos" & bl2 & freg2(insn));
when FITOD => return(tostf(insn.pc) & bb & "fitod" & bl2 & freg2(insn));
when FSTOI => return(tostf(insn.pc) & bb & "fstoi" & bl2 & freg2(insn));
when FDTOI => return(tostf(insn.pc) & bb & "fdtoi" & bl2 & freg2(insn));
when FSTOD => return(tostf(insn.pc) & bb & "fstod" & bl2 & freg2(insn));
when FDTOS => return(tostf(insn.pc) & bb & "fdtos" & bl2 & freg2(insn));
when FMOVS => return(tostf(insn.pc) & bb & "fmovs" & bl2 & freg2(insn));
when FNEGS => return(tostf(insn.pc) & bb & "fnegs" & bl2 & freg2(insn));
when FABSS => return(tostf(insn.pc) & bb & "fabss" & bl2 & freg2(insn));
when FSQRTS => return(tostf(insn.pc) & bb & "fsqrts" & bl2 & freg2(insn));
when FSQRTD => return(tostf(insn.pc) & bb & "fsqrtd" & bl2 & freg2(insn));
when FADDS => return(tostf(insn.pc) & bb & "fadds" & bl2 & freg3(insn));
when FADDD => return(tostf(insn.pc) & bb & "faddd" & bl2 & freg3(insn));
when FSUBS => return(tostf(insn.pc) & bb & "fsubs" & bl2 & freg3(insn));
when FSUBD => return(tostf(insn.pc) & bb & "fsubd" & bl2 & freg3(insn));
when FMULS => return(tostf(insn.pc) & bb & "fmuls" & bl2 & freg3(insn));
when FMULD => return(tostf(insn.pc) & bb & "fmuld" & bl2 & freg3(insn));
when FSMULD => return(tostf(insn.pc) & bb & "fsmuld" & bl2 & freg3(insn));
when FDIVS => return(tostf(insn.pc) & bb & "fdivs" & bl2 & freg3(insn));
when FDIVD => return(tostf(insn.pc) & bb & "fdivd" & bl2 & freg3(insn));
when others => return(tostf(insn.pc) & bb & "unknown Fopcode: " & tost(insn.op));
end case;
when FPOP2 =>
case opf is
when FCMPS => return(tostf(insn.pc) & bb & "fcmps" & bl2 & fregc(insn));
when FCMPD => return(tostf(insn.pc) & bb & "fcmpd" & bl2 & fregc(insn));
when FCMPES => return(tostf(insn.pc) & bb & "fcmpes" & bl2 & fregc(insn));
when FCMPED => return(tostf(insn.pc) & bb & "fcmped" & bl2 & fregc(insn));
when others => return(tostf(insn.pc) & bb & "unknown Fopcode: " & tost(insn.op));
end case;
when CPOP1 =>
return(tostf(insn.pc) & bb & "cpop1" & bl2 & tost("000"&opf) & ", " &creg3(insn));
when CPOP2 =>
return(tostf(insn.pc) & bb & "cpop2" & bl2 & tost("000"&opf) & ", " &creg3(insn));
when others => return(tostf(insn.pc) & bb & "unknown opcode: " & tost(insn.op));
end case;
when LDST =>
case op3 is
when STC =>
return(tostf(insn.pc) & bb & "st" & bl2 & stparcp(insn, rd, dec));
when STF =>
return(tostf(insn.pc) & bb & "st" & bl2 & stparf(insn, rd, dec));
when ST =>
if rd = "00000" then
return(tostf(insn.pc) & bb & "clr" & bl2 & stparc(insn, rd, dec));
else
return(tostf(insn.pc) & bb & "st" & bl2 & stpar(insn, rd, dec));
end if;
when STB =>
if rd = "00000" then
return(tostf(insn.pc) & bb & "clrb" & bl2 & stparc(insn, rd, dec));
else
return(tostf(insn.pc) & bb & "stb" & bl2 & stpar(insn, rd, dec));
end if;
when STH =>
if rd = "00000" then
return(tostf(insn.pc) & bb & "clrh" & bl2 & stparc(insn, rd, dec));
else
return(tostf(insn.pc) & bb & "sth" & bl2 & stpar(insn, rd, dec));
end if;
when STDC =>
return(tostf(insn.pc) & bb & "std" & bl2 & stparcp(insn, rd, dec));
when STDF =>
return(tostf(insn.pc) & bb & "std" & bl2 & stparf(insn, rd, dec));
when STCSR =>
return(tostf(insn.pc) & bb & "st" & bl2 & "%csr, [" & regimm(insn,dec,true) & "]");
when STFSR =>
return(tostf(insn.pc) & bb & "st" & bl2 & "%fsr, [" & regimm(insn,dec,true) & "]");
when STDCQ =>
return(tostf(insn.pc) & bb & "std" & bl2 & "%cq, [" & regimm(insn,dec,true) & "]");
when STDFQ =>
return(tostf(insn.pc) & bb & "std" & bl2 & "%fq, [" & regimm(insn,dec,true) & "]");
when ISTD =>
return(tostf(insn.pc) & bb & "std" & bl2 & stpar(insn, rd, dec));
when STA =>
return(tostf(insn.pc) & bb & "sta" & bl2 & stpara(insn, rd, dec));
when STBA =>
return(tostf(insn.pc) & bb & "stba" & bl2 & stpara(insn, rd, dec));
when STHA =>
return(tostf(insn.pc) & bb & "stha" & bl2 & stpara(insn, rd, dec));
when STDA =>
return(tostf(insn.pc) & bb & "stda" & bl2 & stpara(insn, rd, dec));
when LDC =>
return(tostf(insn.pc) & bb & "ld" & bl2 & ldparcp(insn, rd, dec));
when LDF =>
return(tostf(insn.pc) & bb & "ld" & bl2 & ldparf(insn, rd, dec));
when LDCSR =>
return(tostf(insn.pc) & bb & "ld" & bl2 & "[" & regimm(insn,dec,true) & "]" & ", %csr");
when LDFSR =>
return(tostf(insn.pc) & bb & "ld" & bl2 & "[" & regimm(insn,dec,true) & "]" & ", %fsr");
when LD =>
return(tostf(insn.pc) & bb & "ld" & bl2 & ldpar(insn, rd, dec));
when LDUB =>
return(tostf(insn.pc) & bb & "ldub" & bl2 & ldpar(insn, rd, dec));
when LDUH =>
return(tostf(insn.pc) & bb & "lduh" & bl2 & ldpar(insn, rd, dec));
when LDDC =>
return(tostf(insn.pc) & bb & "ldd" & bl2 & ldparcp(insn, rd, dec));
when LDDF =>
return(tostf(insn.pc) & bb & "ldd" & bl2 & ldparf(insn, rd, dec));
when LDD =>
return(tostf(insn.pc) & bb & "ldd" & bl2 & ldpar(insn, rd, dec));
when LDSB =>
return(tostf(insn.pc) & bb & "ldsb" & bl2 & ldpar(insn, rd, dec));
when LDSH =>
return(tostf(insn.pc) & bb & "ldsh" & bl2 & ldpar(insn, rd, dec));
when LDSTUB =>
return(tostf(insn.pc) & bb & "ldstub" & bl2 & ldpar(insn, rd, dec));
when SWAP =>
return(tostf(insn.pc) & bb & "swap" & bl2 & ldpar(insn, rd, dec));
when LDA =>
return(tostf(insn.pc) & bb & "lda" & bl2 & ldpara(insn, rd, dec));
when LDUBA =>
return(tostf(insn.pc) & bb & "lduba" & bl2 & ldpara(insn, rd, dec));
when LDUHA =>
return(tostf(insn.pc) & bb & "lduha" & bl2 & ldpara(insn, rd, dec));
when LDDA =>
return(tostf(insn.pc) & bb & "ldda" & bl2 & ldpara(insn, rd, dec));
when LDSBA =>
return(tostf(insn.pc) & bb & "ldsba" & bl2 & ldpara(insn, rd, dec));
when LDSHA =>
return(tostf(insn.pc) & bb & "ldsha" & bl2 & ldpara(insn, rd, dec));
when LDSTUBA =>
return(tostf(insn.pc) & bb & "ldstuba" & bl2 & ldpara(insn, rd, dec));
when SWAPA =>
return(tostf(insn.pc) & bb & "swapa" & bl2 & ldpara(insn, rd, dec));
when others => return(tostf(insn.pc) & bb & "unknown opcode: " & tost(insn.op));
end case;
when others => return(tostf(insn.pc) & bb & "unknown opcode: " & tost(insn.op));
end case;
end if;
end;
procedure print(s : string) is
variable L1 : line;
begin
L1:= new string'(s); --'
-- write(L1, s);
writeline(output,L1);
end;
procedure trace(signal debug : in iu_debug_out_type; DISASS : boolean) is
variable insn : debug_info;
variable wr_annul : std_logic;
begin
if DEBUGFPU and (FPIFTYPE = parallel) and (FPCORE = grfpu) then
wr_annul := debug.wr.annul or debug.fpdbg.wr_fp;
else
wr_annul := debug.wr.annul;
end if;
if DISASS or DEBUGFPU then
if (debug.rst = '1') and debug.clk'event and (debug.clk = '1') and ((debug.holdn = '1')) then --'
insn.op := debug.wr.inst;
insn.pc := debug.wr.pc(31 downto 2) & "00";
if (((not wr_annul) and debug.wr.pv) = '1') and
not (DEBUG_UNIT and (debug.vdmode = '1'))
then
if DISASS then
if debug.trap = '1' then
print (disas(insn) & " (trapped, tt = " & tostf(debug.tt) & ")");
else
print (disas(insn));
end if;
end if;
end if;
if wr_annul = '0' then
if DEBUGIURF then
if (debug.write_reg = '1') then
print(tostf(insn.pc) & ": %r" & tost(debug.wr.rd) & " = " & tost(debug.result));
end if;
end if;
if DEBUGFPU and (FPIFTYPE = serial) then
if (debug.write_reg = '1') and (debug.wr.rd(7 downto 5) = "100") then
print(tosth(insn.pc) & ": %f" & tostd(debug.wr.rd(4 downto 0)) &
" = " & tosth(debug.result));
end if;
end if;
end if;
if (DEBUGFPU or DISASS) and (FPIFTYPE = parallel) and (FPCORE = grfpu) then
insn.op := debug.fpdbg.op;
insn.pc := debug.fpdbg.pc(31 downto 2) & "00";
if debug.fpdbg.wr2_fp = '1' then
if DISASS then
print(disas(insn));
end if;
if DEBUGFPU then
if debug.fpdbg.write_fpreg(0) = '1' then
print(tostf(insn.pc) & ": %f" & tostd(debug.fpdbg.fpreg & '0') & " = " & tostf(debug.fpdbg.ddata(63 downto 32)));
end if;
if debug.fpdbg.write_fpreg(1) = '1' then
print(tostf(insn.pc) & ": %f" & tostd(debug.fpdbg.fpreg & '1') & " = " & tostf(debug.fpdbg.ddata(31 downto 0)));
end if;
if debug.fpdbg.write_fsr = '1' then
print(tostf(insn.pc) & ": %fsr" & " = " & tostf(debug.fpdbg.ddata(63 downto 32)));
end if;
end if;
end if;
end if;
end if;
end if;
end;
end debug;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?