рднрд╛рдЧ 5/2 Bldgред 1: RocketChip рдПрд╡реЗрдиреНрдпреВ рдФрд░ рдлрд┐рд╕рд▓рди рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдЯреНрд░реИрдХ рдХрд╛ рдЪреМрд░рд╛рд╣рд╛

рдкрд┐рдЫрд▓реЗ рдЪрд╛рд░ рднрд╛рдЧреЛрдВ рдореЗрдВ, рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА рд░реЙрдХреЗрдЯ рдХреЛрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░реА рдХреА рдЧрдИ рдереА, рдЕрд░реНрдерд╛рддреН, рдЗрд╕ рдХреЛрд░ рдХреЛ рдЕрд▓реНрдЯрд░рдЯрд╛ рдПрдлрдкреАрдЬреАрдПрдПрд╕ (рдЕрдм рдЗрдВрдЯреЗрд▓) рдХреЗ рд╕рд╛рде рдПрдХ "рдЧреИрд░-рдорд╛рдирдХ" рдмреЛрд░реНрдб рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ , рдпрд╣ рдЗрд╕ рдмреЛрд░реНрдб рдкрд░ рд▓рд┐рдирдХреНрд╕ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ред рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдХреНрдпрд╛ рд╕реВрдЭрд╛? рдпрд╣ рддрдереНрдп рдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдореБрдЭреЗ рдХреЛрдбрд╛рдВрддрд░рдХ RISC-V, C рдФрд░ рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдерд╛, рдФрд░ рдЙрди рд╕рднреА рдореЗрдВ, рд╕реНрдХрд╛рд▓рд╛ рд╕рдмрд╕реЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреА рднрд╛рд╖рд╛ рдереА (рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЙрд╕ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ)ред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдЖрдЗрдП C рдХреЛ рдЖрдкрддреНрддрд┐рдЬрдирдХ рди рдмрдирд╛рдПрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рд╕реНрдХреЗрд▓рд╛ + рдЫреЗрдиреА рдмрдВрдбрд▓ рдХреЗрд╡рд▓ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЖрдЬ рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рд╕рд░рд▓ рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ "рдХреИрд╕реЗ" рдЦреАрдВрдЪреЗрдВред


рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп QInst рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рддреБрдЪреНрдЫ AFL рдЬреИрд╕реЗ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреНрд╕ рдХрд╛ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдПрдХ рдЙрдк-рдЙрддреНрдкрд╛рдж рд╣реИред


рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ RTL рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдУрдкрдирд╕реАрдПрд▓ (рдФрд░ рдПрдХ рдирд╣реАрдВ) рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╣реИред рдореБрдЭреЗ RISC-V рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди COPILOT рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓реА, рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рди рд▓рдХреНрд╖реНрдп (рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдиреНрдирдд) рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдЧреБрдЧрд▓реА рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдПрдХ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдЙрддреНрдкрд╛рдж рднреА рд╣реИред рдореИрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ OpenSource рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╡реЗ рд╣реИрдВ, рддреЛ рднреА рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдордЬрд╝рд╛ рд╣реИ - рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдорд╛рдорд▓реЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рдлрд┐рд░ рдпрд╣ рдХреИрд╕реЗ рдЬрд╛рддрд╛ рд╣реИ ...


рдЕрд╕реНрд╡реАрдХрд░рдг ("рдЖрдЧ рдмреБрдЭрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдиреГрддреНрдп" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдЕрд▓рд╛рд╡рд╛): рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдкрд░рд┐рдгрд╛рдореА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде - рдЕрдм рддрдХ рдореБрдЭреЗ рдЗрддрдирд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ / рдпрд╛ рдХреЛрд░ рдХреЗ рдмреАрдЪ рдХреБрдЫ рд╕реАрдорд╛ рдорд╛рдорд▓реЗ рдореЗрдВ "рдкреНрд░рд╡рд╛рд╣"ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐ рдбреЗрдЯрд╛ "рдмреАрдЯ" рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрднреА рднреА рдорд╛рдиреНрдпрддрд╛ рдФрд░ рдорд╛рдиреНрдпрддрд╛ рд╣реИ ...


рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ "рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди" рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВ? рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕рдВрдХреНрд░рдордг (рд╕рд╢рд░реНрдд рдФрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд) рдХреЗрд╡рд▓ рдирд┐рд░рдВрддрд░ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрджреЗрд╢ рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, "рдЧрддрд┐рд╢реАрд▓" рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛, рд╕рднреА рд╕рдВрднрд╡ рд╕рдВрдХреНрд░рдордгреЛрдВ рдХрд╛ рдЧреНрд░рд╛рдл (рдирд┐рд░реНрджреЗрд╢рд┐рдд) рдПрд╕рд╛рдЗрдХреНрд▓рд┐рдХ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИ рдФрд░, рдЗрд╕реЗ рдПрдХ рдЕрд╕реЗрдВрдмрд▓рд░ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рд╕рд╛рде рдмрджрд▓рдХрд░, рд╕рдВрд╢реНрд▓реЗрд╖рдг рдЪрд░рдг рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдЗрд╕реЗ "рд╕реАрд╡реЗ" рдХрд░реЗрдВ, рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╢рд╛рдЦрд╛ рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


C рдХреЛ рд╕рдордЭрдирд╛ рд╕реАрдЦрдирд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд╣реАрдВ)


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо C рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВрдЧреЗ? рдпрд╣ рд╕рд╣реА рд╣реИ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ - рдпрд╣ рд╡реНрдпрд░реНрде рдирд╣реАрдВ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕реАрдЦрд╛: рдЖрдкрдХреЛ рдмрд╕ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рд╕реА / рд░рд╕реНрдЯ / рдХреБрдЫ рдФрд░ рдХреЛ рдПрдХ рдИрдкреАрдкреАрдПрдл рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВред рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИрдВ рдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдЖрдк рдХреЗрд╡рд▓ elf.h рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЬреЗрдПрдирдПрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╡реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрд╛рдЗрдВрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рди рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдмрд▓реНрдХрд┐ рдЬреЗрдПрдирдП рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рднреА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ (рдЬреЗрдПрдирдЖрдИ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП)ред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА рдмрд╛рдЗрдХ рд▓рд┐рдЦреВрдВрдЧрд╛ рдФрд░ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЧрдгрдирд╛ рдФрд░ рдСрдлрд╕реЗрдЯ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд▓рд┐рдЦреВрдВрдЧрд╛ред рдкрд░рд┐рдгрд╛рдо рдФрд░ рдордзреНрдпрд╡рд░реНрддреА рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ:


 sealed trait SectionKind case object RegularSection extends SectionKind case object SymtabSection extends SectionKind case object StrtabSection extends SectionKind case object RelSection extends SectionKind final case class Elf64Header( sectionHeaders: Seq[ByteBuffer], sectionStringTableIndex: Int ) final case class Elf64Section( data: ByteBuffer, linkIndex: Int, infoIndex: Int, kind: SectionKind ) final case class Symbol( name: String, value: Int, size: Int, shndx: Int, isInstrumenter: Boolean ) final case class Relocation( relocatedSection: Int, offset: Int, symbol: Symbol ) final case class BpfInsn( opcode: Int, dst: Int, src: Int, offset: Int, imm: Either[Long, Symbol] ) final case class BpfProg( name: String, insns: Seq[BpfInsn] ) 

рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ - рдпрд╣ java.nio.ByteBuffer рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рд╕реБрд╕реНрдд рдмрд╛рдЗрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд╣реИ - рд╕рднреА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗ рд╣реА рдИрдПрд▓рдПрдл рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдкрд░ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреА рдЧрдИ рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ opcode == 0x18 (рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ 64-рдмрд┐рдЯ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдорд╛рди рд▓реЛрдб рдХрд░рдирд╛) рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛ 8-рдмрд╛рдЗрдЯ рд╢рдмреНрдж рд▓реЗрддрд╛ рд╣реИ (рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреНрдп opcodes рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдирдХреЗ рд╕рд╛рде рдЕрднреА рддрдХ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реВрдВ) , рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╕реЗ рдЬреБрдбрд╝реЗ рдореЗрдореЛрд░реА рдкрддреЗ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, __builtin_popcountl рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ 64-рдмрд┐рдЯ рд╕реНрдерд┐рд░ 0x0101010101010101 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреИрдЪ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде "рдИрдорд╛рдирджрд╛рд░" рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд░реНрдгреЛрдВ рдХреЛ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рд╕рдЬрд╛ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ), рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ COMMON рдЕрдиреБрднрд╛рдЧ рдХреЗ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрддреЗ рдХреЗ рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмреИрд╕рд╛рдЦреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХреЗ (рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирд┐рд░рдВрддрд░ / рдЧреИрд░-рд╕реНрдерд┐рд░ UInt рд╕рд╛рде рдиреГрддреНрдп рдХреЗ рд╕рд╛рде)ред


рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ


рдЗрд╕рд▓рд┐рдП, рдЕрдиреБрдорд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдорд╛рд░реНрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдПрдХ рдЙрдиреНрдореБрдЦ рдЪрдХреНрд░реАрдп рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде рдмрд╣рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рджрд╣рдирд╢реАрд▓ рддрд░реНрдХ рд╣реИрдВ (рдЬреЛ рдХрд┐ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╣реИрдВ), рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рдкреНрд░рд╛рдкреНрдд, рд╕рд╛рде рд╣реА рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рд▓реЛрдб / рд╕реНрдЯреЛрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рджреЗрд░реАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдСрдкрд░реЗрд╢рди рдПрдХ рдШрдбрд╝реА рдЪрдХреНрд░ рдореЗрдВ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд╕рд░рд▓ рдХрд░реЗрдВрдЧреЗ: рд╣рдо UInt рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди (UInt, Bool) : рдЬреЛрдбрд╝реА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдореВрд▓реНрдп рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЗрд╕рдХреА рд╢реБрджреНрдзрддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИред рдпрд╣реА рд╣реИ, рдпрд╣ рдореЗрдореЛрд░реА рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдкрддрд╛ рдЧрд▓рдд рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред


EBPF рдмрд╛рдЗрдЯрдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдореЙрдбрд▓ 64-рдмрд┐рдЯ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд░реИрдо рдХреЛ рдорд╛рдирддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА 16 (рдпрд╛ рджрд╕) 64-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдПрдХ рдЖрджрд┐рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ:


  • рд╣рдо рдЙрд╕ рд╕рдВрджрд░реНрдн рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХреЗ r1 рдФрд░ r2 рдореЗрдВ r2 , рдмрд╛рдХреА рдореЗрдВ - рд╢реВрдиреНрдп, рд╕рднреА рд╡реИрдз (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╡реИрдзрддрд╛ рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рдХреА "рддрддреНрдкрд░рддрд╛" рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ)
  • рдпрджрд┐ рд╣рдо рдПрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп-рддрд╛рд░реНрдХрд┐рдХ рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕рдХреЗ рдСрдкрд░реЗрдВрдб рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рд╕реВрдЪреА рдХреА рдкреВрдВрдЫ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдЬрд┐рд╕рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдВрдб рдХреЛ рдПрдХ рдЬреЛрдбрд╝реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (data1 op data2, valid1 && valid2)
  • рдпрджрд┐ рд╣рдо рдПрдХ рд╢рд╛рдЦрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ рджреЛрдиреЛрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ: рдпрджрд┐ рд╢рд╛рдЦрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ
  • рдЕрдЧрд░ рд╣рдо рдореЗрдореЛрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдпрд╛ рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╣рдо рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ: рд╣рдо рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдПрдХ рдмрд╛рд░ valid рдмрдпрд╛рди рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реЗрд╡ рдСрдкрд░реЗрд╢рди рдХреА рд╡реИрдзрддрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ globalValid рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕реА рд╕рдордп, рд╣рдореЗрдВ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдФрд░ рдЕрдиреНрдп рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордиреЗ рдХреА рдУрд░ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдВрдЪрд╛рд▓рди рдпрдерд╛рд╕рдВрднрд╡ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЪрд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВред рдЙрд╕реА рд╕рдордп, рдореИрдВ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрдореЛрд░реА рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд╛рдЗрдЯ рдкрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ, рдпреВрдмреАред рдпрд╛рдиреА *addr += 1 - рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЬрдм рддрдХ рдкрдврд╝рдирд╛ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рддрдм рддрдХ рд▓рд┐рдЦрдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреНрдпрд╛ рд▓рд┐рдЦрдирд╛ рд╣реИ), рд▓реЗрдХрд┐рди *addr += 1; return *addr; *addr += 1; return *addr; рдореИрдВрдиреЗ рдЖрдо рддреМрд░ рдкрд░ рд╢реВрдиреНрдп рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рджрд┐рдпрд╛ред рд╢рд╛рдпрдж рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдЕрдзрд┐рдХ рдореБрд╢реНрдХрд┐рд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдкреАрд▓ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рдкрддреЗ рдкрд░ рдХрд╛рдо рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╣реИ valid рд╕рдВрднрд╡ рд╣реЛ valid рд╡реИрдзрд╛рдирд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░реЗрдВред рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдирддреАрдЬрд╛ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ BpfCircuitConstructor , рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВ doMemLoad , doMemStore рдФрд░ resolveSymbol :


 trait BpfCircuitConstructor { // ... sealed abstract class LdStType(val lgsize: Int) { val byteSize = 1 << lgsize val bitSize = byteSize * 8 val mask: UInt = if (bitSize == 64) mask64 else ((1l << bitSize) - 1).U } case object u8 extends LdStType(0) case object u16 extends LdStType(1) case object u32 extends LdStType(2) case object u64 extends LdStType(3) def doMemLoad(addr: UInt, tpe: LdStType, valid: Bool): (UInt, Bool) def doMemStore(addr: UInt, tpe: LdStType, data: UInt, valid: Bool): Bool sealed trait Resolved { def asPlainValue: UInt def load(ctx: Context, offset: Int, tpe: LdStType, valid: Bool): LazyData def store(offset: Int, tpe: LdStType, data: UInt, valid: Bool): Bool } def resolveSymbol(sym: BpfLoader.Symbol): Resolved // ... } 

рд╕реАрдкреАрдпреВ рдХреЛрд░ рдПрдХреАрдХрд░рдг


рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛: рдорд╛рдирдХ RoCC (рд░реЙрдХреЗрдЯ рдХрд╕реНрдЯрдо рдХреЙрдкреНрд░реЗрд╕рд░) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рд╕рднреА рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА-рд╕рдВрдЧрдд рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рд░реЙрдХреЗрдЯ рдФрд░ рдмреЙрдо (рдмрд░реНрдХрд▓реЗ рдЖрдЙрдЯ-рдСрдл-рдСрд░реНрдбрд░ рдорд╢реАрди) рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЬрдм custom0 рдкрд░ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХрд╛рд░реНрдп рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдбрд╛рдВрддрд░рдХ custom0 mnemonics рдЙрдирдореЗрдВ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ - custom3 рддреНрд╡рд░рдХ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рд░реЙрдХреЗрдЯ / BOOM рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдореЗрдВ рдЪрд╛рд░ RoCC рддреНрд╡рд░рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг рднреА рд╣реИрдВ:


Configs.scala:


 class WithRoccExample extends Config((site, here, up) => { case BuildRoCC => List( (p: Parameters) => { val accumulator = LazyModule(new AccumulatorExample(OpcodeSet.custom0, n = 4)(p)) accumulator }, (p: Parameters) => { val translator = LazyModule(new TranslatorExample(OpcodeSet.custom1)(p)) translator }, (p: Parameters) => { val counter = LazyModule(new CharacterCountExample(OpcodeSet.custom2)(p)) counter }) }) 

рдЗрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди LazyRoCC.scala рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИред


рддреНрд╡рд░рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдореЛрд░реА рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рджреЛ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ: рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ LazyRoCC , LazyRoCCModuleImp рд╕реЗ рджреВрд╕рд░реЗ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рджреВрд╕рд░реЗ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ io рдкреЛрд░реНрдЯ рд╣реИ RoCCIO , рдЬрд┐рд╕рдореЗрдВ cmd рдЕрдиреБрд░реЛрдз рдкреЛрд░реНрдЯ, рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдкреЛрд░реНрдЯ, рдореЗрдо рдПрдХреНрд╕реЗрд╕ L1D рдХреИрд╢ рдкреЛрд░реНрдЯ, busy рдФрд░ interrupt рдЖрдЙрдЯрдкреБрдЯ рдФрд░ exception рдЗрдирдкреБрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рдкреЗрдЬ рдЯреЗрдмрд▓ рд╡реЙрдХрд░ рдкреЛрд░реНрдЯ рдФрд░ FPUs рднреА рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЕрднреА рддрдХ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ (рд╡реИрд╕реЗ рднреА, eBPF рдореЗрдВ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрдХрдЧрдгрд┐рдд рдирд╣реАрдВ рд╣реИ)ред рдЕрдм рддрдХ рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЯрдЪ interrupt рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЧреИрд░-рдХреИрд╢реНрдб рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд╛рдЗрд▓рд▓рд┐рдВрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред


рдХреНрд╡реЗрд░реА рдЖрдпреЛрдЬрдХ


рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреИрд╢ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЛрд░реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪрд░ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ, рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рдПрдХ рдПрдХрд▓ рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ) рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЗрд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ, рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдЗрд╕реЗ nontrivially рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдЕрдВрдд рдореЗрдВ, рдПрдХ рдПрдХрд▓ рдирд┐рд░реНрджреЗрд╢ рдХрдИ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╢рд╛рдпрдж рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, рджреВрд╕рд░реА рдУрд░, рдХреНрдпреЛрдВ рдирд╣реАрдВ, рдХрд╣рддреЗ рд╣реИрдВ, рддреАрди рд╢рдмреНрджреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВ (рдЬреЛ рдХрд┐, рд╕рдВрднрд╡рддрдГ, рдХреИрд╢ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдВ), рдХрд┐рд╕реА рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрди рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ (рддрдм рдПрдХ рд╣рд░рд╛) рдФрд░ рдкрд░рд┐рдгрд╛рдо рдмрдЪрд╛рдУред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдХреАрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдПрдХрд▓ рдХреИрд╢ рдкреЛрд░реНрдЯ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкрд╣реБрдВрдЪ рдкрд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ "рд╣рд▓" рдкреНрд░рдпрд╛рд╕ рдХрд░реЗред


рддрд░реНрдХ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдВрдЧреЗ: рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдк-рдЗрдВрдЬреЗрдХреНрд╢рди (RoCC рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ 7-рдмрд┐рдЯ рдлрд╝рдВрдХреНрд╢рдирд▓ рдлрд╝реАрд▓реНрдб) рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдХреНрд╡реЗрд░реА рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдореБрдЭреЗ рдмрд╣реБрдд рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдХрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░) рд╕реНрдХреНрд╡реИрдВрдбрд░ Fmax рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ)ред рдЕрдЧрд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ "рд╕реЗрд╡рд░" / "рд▓реЛрдбрд░" рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЬреЛ рдХрд┐ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИред рдПрдХ рдЬреАрд╡рд┐рдд рдХрддрд╛рд░ рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд╛рдп рдкрд░, рдкрдВрдЬреАрдХрд░рдг рдЖрджреЗрд╢ рдореЗрдВ рдкрд╣рд▓рд╛ рдЕрдиреБрд░реЛрдз рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЙрд╕реЗ рдЕрдЧрд▓реЗ рдЙрдкрд╛рдп рдкрд░ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реНрдХ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд┐рд░реНрдл рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдордЭрджрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ)ред рдореИрдВрдиреЗ PeekPokeTester рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдШрдЯрдХ рд╕реЗ рдорд╛рдирдХ PeekPokeTester рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдмрд╛рд░ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдерд╛ ред


рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЧрд░реНрднрдирд┐рд░реЛрдзрдХ рдерд╛:


 class Serializer(isComputing: Bool, next: Bool) { def monotonic(x: Bool): Bool = { val res = WireInit(false.B) val prevRes = RegInit(false.B) prevRes := res && isComputing res := (x || prevRes) && isComputing res } private def noone(bs: Seq[Bool]): Bool = !bs.foldLeft(false.B)(_ || _) private val previousReqs = ArrayBuffer[Bool]() def nextReq(x: Bool): (Bool, Int) = { val enable = monotonic(x) val result = RegInit(false.B) val retired = RegInit(false.B) val doRetire = result && next val thisReq = enable && !retired && !doRetire val reqWon = thisReq && noone(previousReqs) when (isComputing) { when(reqWon) { result := true.B } when(doRetire) { result := false.B retired := true.B } } otherwise { result := false.B retired := false.B } previousReqs += thisReq (result, previousReqs.length - 1) } } 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдбрд┐рдЬрд┐рдЯрд▓ рд╕рд░реНрдХрд┐рдЯ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ ArrayBuffer рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рд░реНрдХрд┐рдЯ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдвреЗрд░ рд╣реЛ рдЧрдП рд╣реИрдВ ( Boolean ArrayBuffer рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, Bool рдПрдХ рдЫреЗрдиреА рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд▓рд╛рдЗрд╡ рдЙрдкрдХрд░рдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХреБрдЫ рдмреВрд▓рд┐рдпрди рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред


L1D рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛


рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЬреНрдпрд╛рджрд╛рддрд░ io.mem.req рдЕрдиреБрд░реЛрдз io.mem.req рдФрд░ io.mem.resp рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ io.mem.resp рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЕрдиреБрд░реЛрдз рдкреЛрд░реНрдЯ рдкрд╛рд░рдВрдкрд░рд┐рдХ ready рдФрд░ valid рд╕рдВрдХреЗрддреЛрдВ рд╕реЗ рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╣реИ: рдкрд╣рд▓рд╛ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рджреВрд╕рд░рд╛ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рд╕рд╛рдордиреЗ, valid && resp рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕реЗ рдХреБрдЫ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ, рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдХреНрд╖рдг рд╕реЗ рд▓реЗрдХрд░ true рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗ valid && resp рдмрдврд╝рдд рдХреЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ рддрдХ рд╕рдВрдХреЗрддреЛрдВ рдХреА "рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП fire() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ valid && resp рдЬрд╛ рд╕рдХрддреА рд╣реИ)ред


рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреЛрд░реНрдЯ, рдмрджрд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ valid рд╕рдВрдХреЗрдд рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдШрдбрд╝реА рдЪрдХреНрд░ рдореЗрдВ рдЬрд╡рд╛рдмреЛрдВ рдХреЛ рд░реЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдпрд╣ "рд╣рдореЗрд╢рд╛ рддреИрдпрд╛рд░" рд╣реЛрддрд╛ рд╣реИ, рдзрд╛рд░рдгрд╛ рджреНрд╡рд╛рд░рд╛, рдФрд░ fire() рд╕рд┐рд░реНрдл valid ред


рд╕рд╛рде рд╣реА, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛, рдЬрдм рдЖрдк рднрдпрд╛рдирдХ рд╣реЛрдВ рддреЛ рдЖрдк рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЖрдк рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдкрдврд╝рд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рдЧрдпрд╛ рдЬреЛ рдШрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╛рдж рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рд╡рд╣ рднреА рдХрд┐рд╕реА рддрд░рд╣ рдЕрдЬреАрдм рд╣реИред рд▓реЗрдХрд┐рди Serializer рд╡рд░реНрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рдкрд╣рд▓реЗ рд╣реА рдХреИрд╢ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ: next = io.mem.req.fire() ред рдпрд╣ рд╕рдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ "рд░реАрдбрд░" рдореЗрдВ рдЙрддреНрддрд░ рдХреЗрд╡рд▓ рддрднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдпрд╛ рдерд╛ - рдкрд╣рд▓реЗ рдирд╣реАрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдирд╣реАрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ holdUnless рд╡рд┐рдзрд┐ рд╣реИред рдкрд░рд┐рдгрд╛рдо рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:


  class Constructor extends BpfCircuitConstructor { val serializer = new Serializer(isComputing, io.mem.req.fire()) override def doMemLoad(addr: UInt, tpe: LdStType, valid: Bool): (UInt, Bool) = { val (doReq, thisTag) = serializer.nextReq(valid) when (doReq) { io.mem.req.bits.addr := addr require((1 << io.mem.req.bits.tag.getWidth) > thisTag) io.mem.req.bits.tag := thisTag.U io.mem.req.bits.cmd := M_XRD io.mem.req.bits.typ := (4 | tpe.lgsize).U io.mem.req.bits.data := 0.U io.mem.req.valid := true.B } val doResp = isComputing && serializer.monotonic(doReq && io.mem.req.fire()) && io.mem.resp.valid && io.mem.resp.bits.tag === thisTag.U && io.mem.resp.bits.cmd === M_XRD (io.mem.resp.bits.data holdUnless doResp, serializer.monotonic(doResp)) } override def doMemStore(addr: UInt, tpe: LdStType, data: UInt, valid: Bool): Bool = { val (doReq, thisTag) = serializer.nextReq(valid) when (doReq) { io.mem.req.bits.addr := addr require((1 << io.mem.req.bits.tag.getWidth) > thisTag) io.mem.req.bits.tag := thisTag.U io.mem.req.bits.cmd := M_XWR io.mem.req.bits.typ := (4 | tpe.lgsize).U io.mem.req.bits.data := data io.mem.req.valid := true.B } serializer.monotonic(doReq && io.mem.req.fire()) } override def resolveSymbol(sym: BpfLoader.Symbol): Resolved = sym match { case BpfLoader.Symbol(symName, _, size, ElfConstants.Elf64_Shdr.SHN_COMMON, false) if size <= 8 => RegisterReference(regs.getOrElseUpdate(symName, RegInit(0.U(64.W)))) } } 

рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрдиреНрди рдЙрдк-рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдвреЗрд░ рдкрд░ рд╕рднреА рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдирд╣реАрдВ рд╣реИ


рд╣рдореНрдо, рдПрдХ рдореЙрдбрд▓ рдЙрджрд╛рд╣рд░рдг рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рдХрд┐рд╕ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛? рдмреЗрд╢рдХ, рдПрдПрдлрдПрд▓ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди! рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ:


 #include <stdint.h> extern uint8_t *__afl_area_ptr; extern uint64_t prev; void inst_branch(uint64_t tag) { __afl_area_ptr[((prev >> 1) ^ tag) & 0xFFFF] += 1; prev = tag; } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ __afl_area_ptr рд╕реЗ рдПрдХ рдмрд╛рдЗрдЯ рдХрд╛ рдХрдореЛрдмреЗрд╢ рд▓реЙрдЬрд┐рдХрд▓ рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд╕реЗрд╡рд┐рдВрдЧ (рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдЗрдиреНрдХреНрд░реАрдореЗрдВрдЯ) рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд░рдЬрд┐рд╕реНрдЯрд░ __afl_area_ptr рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣рд╛ рд╣реИ!


рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ Resolved рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕рдВрджрд░реНрдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЕрдм рддрдХ рдореИрдВ рдХреЗрд╡рд▓ рдЖрдХрд╛рд░ рдореЗрдВ 1, 2, 4 рдпрд╛ 8 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕реНрдХреЗрд▓рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рдСрдлрд╕реЗрдЯ рдкрд░ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЙрд▓ рдХреЗ рдЖрджреЗрд╢ рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╢рд╛рдВрддрд┐ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЬрд╛рдирдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ prev рдХреЛ рдкрд╣рд▓реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред


рдФрд░ рдЕрдм рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди


рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рд╣рдореЗрдВ RoCC рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдФрд░ рдХрдо рдпрд╛ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рддреНрд╡рд░рдХ рдорд┐рд▓рд╛ред рдЕрдм рдХреНрдпрд╛? рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдзрдХреЗрд▓рддреЗ рд╣реБрдП рд╕рднреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ? рдореБрдЭреЗ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реБрдЖ рдХрд┐ рдХрдо рдмреИрд╕рд╛рдЦреА рдХреА рдЬрд░реВрд░рдд рд╣реЛрдЧреА, рдпрджрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдорд╛рди рдХреЗ рд╕рд╛рде funct рдмрд╕ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рддрдбрд╝рдкрд╛рдирд╛ рдкрдбрд╝рд╛: рдореИрдВрдиреЗ рд╕рд┐рдЧреНрдирд▓рдЯреИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕реАрдЦ рд▓рд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рд▓рдЧрднрдЧ рдЕрдВрдзрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж рдкрд╛рдВрдЪ рдорд┐рдирдЯ рдХреЗ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде (рдмреВрдЯреНрд░реЛрдо рдмрджрд▓рдиреЗ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде - рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рддреЗрдЬ рд╣реИ - рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред


рдирддреАрдЬрддрди, рдХрдорд╛рдВрдб рдбрд┐рдХреЛрдбрд░ рдХреЛ рдШреБрдорд╛рдпрд╛ рдЧрдпрд╛ рдФрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдереЛрдбрд╝рд╛ "рд╕реАрдзрд╛" рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбрд┐рдХреЛрдбрд░ рдиреЗ рдЬреЛ рднреА рдХрд╣рд╛, рд╡рд╣ рдЦреБрдж рдХреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рд╡рд┐рд▓рдВрдмрд┐рдд рд▓реЗрдЦрди рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдбрд┐рд╡реАрдЬрди рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдХреИрд╢ рдпрд╛рдж рдЖрддреА рд╣реИред


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╡рд┐рд╡рд░рдг рдПрдХ рдЬреЛрдбрд╝реА рд╣реИ ([рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдЯрд░реНрди], [рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреЗ рдбреЗрдЯрд╛ рдкрде рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕реЗрдЯ])ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, default (рдЕрдкрд░рд┐рдЪрд┐рдд рдирд┐рд░реНрджреЗрд╢) рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ IDecode.scala рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдбреЗрд╕реНрдХрдЯреЙрдк рд╣реЗрдмрд░ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдмрджрд╕реВрд░рдд рджрд┐рдЦрддрд╛ рд╣реИ):


 def default: List[BitPat] = // jal renf1 fence.i // val | jalr | renf2 | // | fp_val| | renx2 | | renf3 | // | | rocc| | | renx1 s_alu1 mem_val | | | wfd | // | | | br| | | | s_alu2 | imm dw alu | mem_cmd mem_type| | | | mul | // | | | | | | | | | | | | | | | | | | | | | div | fence // | | | | | | | | | | | | | | | | | | | | | | wxd | | amo // | | | | | | | | scie | | | | | | | | | | | | | | | | | dp List(N,X,X,X,X,X,X,X,X,A2_X, A1_X, IMM_X, DW_X, FN_X, N,M_X, MT_X, X,X,X,X,X,X,X,CSR.X,X,X,X,X) 

... рдФрд░ рд░реЙрдХреЗрдЯ рдХреЛрд░ рдореЗрдВ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 class IDecode(implicit val p: Parameters) extends DecodeConstants { val table: Array[(BitPat, List[BitPat])] = Array( BNE-> List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X, FN_SNE, N,M_X, MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N), BEQ-> List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X, FN_SEQ, N,M_X, MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N), BLT-> List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X, FN_SLT, N,M_X, MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N), BLTU-> List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X, FN_SLTU, N,M_X, MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N), BGE-> List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X, FN_SGE, N,M_X, MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N), BGEU-> List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X, FN_SGEU, N,M_X, MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N), // ... 

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ RISC-V рдореЗрдВ (рди рдХреЗрд╡рд▓ RocketChip рдореЗрдВ, рдмрд▓реНрдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдХрдорд╛рдВрдб рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ) ISA рд╡рд┐рднрд╛рдЬрди рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕рдмреНрдорд┐рдЯ I (рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЪрд╛рд▓рди), рд╕рд╛рде рд╣реА рд╡реИрдХрд▓реНрдкрд┐рдХ M (рдкреВрд░реНрдгрд╛рдВрдХ рдЧреБрдгрди рдФрд░ рд╡рд┐рднрд╛рдЬрди), A (рдПрдЯреЙрдорд┐рдХреНрд╕) рдкрд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрджрд┐


рдирддреАрдЬрддрди, рдореВрд▓ рд╡рд┐рдзрд┐


  def decode(inst: UInt, table: Iterable[(BitPat, List[BitPat])]) = { val decoder = DecodeLogic(inst, default, table) val sigs = Seq(legal, fp, rocc, branch, jal, jalr, rxs2, rxs1, scie, sel_alu2, sel_alu1, sel_imm, alu_dw, alu_fn, mem, mem_cmd, mem_type, rfs1, rfs2, rfs3, wfd, mul, div, wxd, csr, fence_i, fence, amo, dp) sigs zip decoder map {case(s,d) => s := d} this } 

рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ


рд╡рд╣реА, рд▓реЗрдХрд┐рди рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдХреЛрдбрд░ рдФрд░ рдЖрд░рдУрд╕реА рдХреЗ рд╕рдХреНрд░рд┐рдпрдг рдХрд╛ рдХрд╛рд░рдг рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
 def decode(inst: UInt, table: Iterable[(BitPat, List[BitPat])], handlers: Seq[OpcodeHandler]) = { val decoder = DecodeLogic(inst, default, table) val sigs=Seq(legal, fp, rocc_explicit, branch, jal, jalr, rxs2, rxs1, scie, sel_alu2, sel_alu1, sel_imm, alu_dw, alu_fn, mem, mem_cmd, mem_type, rfs1, rfs2, rfs3, wfd, mul, div, wxd, csr, fence_i, fence, amo, dp) sigs zip decoder map {case(s,d) => s := d} if (handlers.isEmpty) { handler_rocc := false.B handler_rocc_funct := 0.U } else { val handlerTable: Seq[(BitPat, List[BitPat])] = handlers.map { case OpcodeHandler(pattern, funct) => pattern -> List(Y, BitPat(funct.U)) } val handlerDecoder = DecodeLogic(inst, List(N, BitPat(0.U)), handlerTable) Seq(handler_rocc, handler_rocc_funct) zip handlerDecoder map { case (s,d) => s:=d } } rocc := rocc_explicit || handler_rocc this } 

рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдмрджрд▓рд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ, рд╢рд╛рдпрдж, рдпрд╣ рдерд╛:


  io.rocc.exception := wb_xcpt && csr.io.status.xs.orR io.rocc.cmd.bits.status := csr.io.status io.rocc.cmd.bits.inst := new RoCCInstruction().fromBits(wb_reg_inst) + when (wb_ctrl.handler_rocc) { + io.rocc.cmd.bits.inst.opcode := 0x0b.U // custom0 + io.rocc.cmd.bits.inst.funct := wb_ctrl.handler_rocc_funct + io.rocc.cmd.bits.inst.xd := false.B + io.rocc.cmd.bits.inst.rd := 0.U + } io.rocc.cmd.bits.rs1 := wb_reg_wdata io.rocc.cmd.bits.rs2 := wb_reg_rs2 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХреНрд╕реЗрд▓реЗрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреЗ рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рдФрд░ funct рдХреНрдпрд╛ рдбрд┐рдХреЛрдбрд░ рд╡рд╛рдкрд╕ рдЖрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдХрдо рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ: рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрдорд╛рдВрдб рд╕реАрдзреЗ рддреНрд╡рд░рдХ (рдЙрдирдореЗрдВ рд╕реЗ рдЪрд╛рд░ - рдЬреЛ рдПрдХ рд╣реИ?) рдкрд░ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд╛рдЙрдЯрд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдвреЛрдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб рдореЗрдВ opcode == custom0 (рд╣рд╛рдБ) рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдФрд░ рдпрд╣ рдареАрдХ рд╢реВрдиреНрдп рддреНрд╡рд░рдХ рд╣реИ!)ред


рдирд┐рд░реАрдХреНрд╖рдг


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд▓реЗрдЦ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдорд╛рдирддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЙрддреНрдкрд╛рджрди рд╕реНрддрд░ рдкрд░ рд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХрдо рд╕реЗ рдХрдо, рдЖрдкрдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рд╕рдВрджрд░реНрдн (рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐) рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдЬрд╛рдВрдЪ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рдЧреНрд░реАрдирд╣рд╛рдЙрд╕ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 #include <stdint.h> uint64_t counter; uint64_t funct1(uint64_t x, uint64_t y) { return __builtin_popcountl(x); } uint64_t funct2(uint64_t x, uint64_t y) { return (x + y) * (x - y); } uint64_t instMUL() { counter += 1; *((uint64_t *)0x81005000) = counter; return 0; } 

рдЕрдм main рд▓рд╛рдЗрди рдореЗрдВ bootrom/sdboot/sd.c рдХреЛ рдЬреЛрдбрд╝реЗрдВ


 #include "/path/to/freedom-u-sdk/riscv-pk/machine/encoding.h" // ... ////    -   RoCC #define STR1(x) #x #define STR(x) STR1(x) #define EXTRACT(a, size, offset) (((~(~0 << size) << offset) & a) >> offset) #define CUSTOMX_OPCODE(x) CUSTOM_##x #define CUSTOM_0 0b0001011 #define CUSTOM_1 0b0101011 #define CUSTOM_2 0b1011011 #define CUSTOM_3 0b1111011 #define CUSTOMX(X, rd, rs1, rs2, funct) \ CUSTOMX_OPCODE(X) | \ (rd << (7)) | \ (0x7 << (7+5)) | \ (rs1 << (7+5+3)) | \ (rs2 << (7+5+3+5)) | \ (EXTRACT(funct, 7, 0) << (7+5+3+5+5)) #define CUSTOMX_R_R_R(X, rd, rs1, rs2, funct) \ asm ("mv a4, %[_rs1]\n\t" \ "mv a5, %[_rs2]\n\t" \ ".word "STR(CUSTOMX(X, 15, 14, 15, funct))"\n\t" \ "mv %[_rd], a5" \ : [_rd] "=r" (rd) \ : [_rs1] "r" (rs1), [_rs2] "r" (rs2) \ : "a4", "a5"); int main(void) { // ... //  RoCC extension write_csr(mstatus, MSTATUS_XS & (MSTATUS_XS >> 1)); //   bootrom       uint64_t res; CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 1); CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 2); // ...     uint64_t x = 1; for (int i = 0; i < 123; ++i) x *= *(volatile uint8_t *)0x80000000; kputc('0' + x % 10); //   !!! // ... } 

write_csr , custom0 - custom3 . , illegal instruction, , , , . define - - , ┬л┬╗ binutils customX RocketChip, , , .


sdboot , , .


:


 $ /hdd/trosinenko/rocket-tools/bin/riscv32-unknown-elf-gdb -q -ex "target remote :3333" -ex "set directories bootrom" builds/zeowaa-e115/sdboot.elf Reading symbols from builds/zeowaa-e115/sdboot.elf...done. Remote debugging using :3333 0x0000000000000000 in ?? () (gdb) x/d 0x81005000 0x81005000: 123 (gdb) set variable $pc=0x10000 (gdb) c Continuing. ^C Program received signal SIGINT, Interrupt. 0x0000000000010488 in crc16_round (data=<optimized out>, crc=<optimized out>) at sd.c:151 151 crc ^= data; (gdb) x/d 0x81005000 0x81005000: 246 

funct1
 $ /hdd/trosinenko/rocket-tools/bin/riscv32-unknown-elf-gdb -q -ex "target remote :3333" -ex "set directories bootrom" builds/zeowaa-e115/sdboot.elf Reading symbols from builds/zeowaa-e115/sdboot.elf...done. Remote debugging using :3333 0x0000000000010194 in main () at sd.c:247 247 CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 1); (gdb) set variable $a5=0 (gdb) set variable $pc=0x10194 (gdb) set variable $a4=0xaa (gdb) display/10i $pc-10 1: x/10i $pc-10 0x1018a <main+46>: sw a3,124(a3) 0x1018c <main+48>: addiw a0,a0,1110 0x10190 <main+52>: mv a4,s0 0x10192 <main+54>: mv a5,a0 => 0x10194 <main+56>: 0x2f7778b 0x10198 <main+60>: mv s0,a5 0x1019a <main+62>: lbu a5,0(a1) 0x1019e <main+66>: addiw a3,a3,-1 0x101a0 <main+68>: mul a2,a2,a5 0x101a4 <main+72>: bnez a3,0x1019a <main+62> (gdb) display/x $a5 2: /x $a5 = 0x0 (gdb) si 0x0000000000010198 247 CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 1); 1: x/10i $pc-10 0x1018e <main+50>: li a0,25 0x10190 <main+52>: mv a4,s0 0x10192 <main+54>: mv a5,a0 0x10194 <main+56>: 0x2f7778b => 0x10198 <main+60>: mv s0,a5 0x1019a <main+62>: lbu a5,0(a1) 0x1019e <main+66>: addiw a3,a3,-1 0x101a0 <main+68>: mul a2,a2,a5 0x101a4 <main+72>: bnez a3,0x1019a <main+62> 0x101a6 <main+74>: li a5,10 2: /x $a5 = 0x4 (gdb) set variable $a4=0xaabc (gdb) set variable $pc=0x10194 (gdb) si 0x0000000000010198 247 CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 1); 1: x/10i $pc-10 0x1018e <main+50>: li a0,25 0x10190 <main+52>: mv a4,s0 0x10192 <main+54>: mv a5,a0 0x10194 <main+56>: 0x2f7778b => 0x10198 <main+60>: mv s0,a5 0x1019a <main+62>: lbu a5,0(a1) 0x1019e <main+66>: addiw a3,a3,-1 0x101a0 <main+68>: mul a2,a2,a5 0x101a4 <main+72>: bnez a3,0x1019a <main+62> 0x101a6 <main+74>: li a5,10 2: /x $a5 = 0x9 

рд╕реНрд░реЛрдд рдХреЛрдб

Source: https://habr.com/ru/post/hi461577/


All Articles