рднрд╛рдЧ 1: рдПрдХ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рдЖрд╡рд╛рд╕ рдореЗрдВ RISC-V / RocketChip

RocketChip рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреА рд▓рд╛рдЧрдд рдХреЗ рдмрд┐рдирд╛ RISC-V рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдПрдХ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдк рдбрд┐рдмрдЧ рдмреЛрд░реНрдб рдкрд░ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ? рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЧреЗрдо рдЬрдирд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрдорд░реНрд╕: "рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреА рд╢реИрд▓реА рдореЗрдВ 20 рдЪреЗрдХрдорд╛рд░реНрдХ рдХреНрд░рд╛рдЗрд╕рд┐рд╕ рд╕реЗ рдмрджрддрд░ рдирд╣реАрдВ рд╣реИрдВ", "рдЖрдк рдХреЛрд░реЛрд╡рд╛рди рдХреЛ рд▓реВрдЯ рд╕рдХрддреЗ рд╣реИрдВ" рдФрд░ "рдЬреЗрдирд░реЗрдЯ" рдмрдЯрдиред RocketChip SoC рдЬрдирд░реЗрдЯрд░ рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЪреЗрдХрдорд╛рд░реНрдХ рд╡рд╛рд▓реА рдПрдХ рдЦрд┐рдбрд╝рдХреА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдФрд░ рдореЗрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕рд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рд░реЙрдХреЗрдЯрд╢рд┐рдк рдХреЛ рдЕрдкрдиреЗ рдореВрд▓ Xilinx рд╕реЗ Altera / Intel рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред


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


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


рд╕рд╛рдордЧреНрд░реА


рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП - рд╢рдмреНрдж рдХреЗ рд╡реНрдпрд╛рдкрдХ рдЕрд░реНрде рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреА рдПрдХ рд╕реВрдЪреАред рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  • рд░реЙрдХреЗрдЯрд╢рд┐рдк - рдЗрд╕рдореЗрдВ рд╕реНрд╡рдпрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдЕрд╕реЗрдВрдмрд▓реА рд╡рд╛рддрд╛рд╡рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИ (рд╕рд╣рд┐рдд, рдХрдИ рдЙрдк-рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ)ред рд░реЙрдХреЗрдЯ рдХреЛрд░ рдЗрди-рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рд░реЙрдХреЗрдЯрд╢рд┐рдк рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдоред
  • SiFive рд╕реНрд╡рддрдВрддреНрд░рддрд╛ - рд╡рд┐рднрд┐рдиреНрди рдбрд┐рдмрдЧ рдмреЛрд░реНрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА - рд╡рд╣рд╛рдВ рд╣рдо рдЕрдкрдиреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ
  • рд░реЙрдХреЗрдЯ-рдЯреВрд▓реНрд╕ - 32- рдФрд░ 64-рдмрд┐рдЯ рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрдирд╛рдиреЗ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг
  • Openocd-riscv - RISC-V рдЧреБрдард▓реА (рдХрдо рд╕реЗ рдХрдо RocketChip) рдХреЗ рд╕рд╛рде JTAG рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OpenOCD рдкреЛрд░реНрдЯ
  • рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдХреЗ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП IntelliJ IDEA рд╕рдореБрджрд╛рдп , рдЬреЛ рдХрд┐ RocketChip рдореЗрдВ рдмрд╣реБрдордд рд╣реИ
  • SiFive рдХреЗ рдкреВрд░реНрд╡-рдЗрдХрдЯреНрдареЗ рдЯреВрд▓рдЪреИрди рднреА рдХрд╛рдо рдореЗрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд▓рд┐рдВрдХ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдЧрдП рд▓реЗрдЦ рдореЗрдВ рджреЗрдЦрд╛ рдерд╛

рд▓реЛрд╣реЗ рд╕реЗ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:


  • Aliexpress рд╕реЗ рдЬрд╝рд┐рдпреЛрд╡рд╛ рдХрд┐рдЯ: рд╕рд╛рдЗрдХреНрд▓реЛрди 4 EP4CE115 рдФрд░ (рдХреНрд▓реЛрди?) USB рдмреНрд▓рд╛рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб
  • рд╕реЙрдлреНрдЯ рдХреЛрд░ рдХреЗ рд▓рд┐рдП JTAG рдбрд┐рдмрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╛рд╕реНрдкрдмреЗрд░реАрдкреА

рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдХреЛ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрдВрдкреНрдпреВрдЯрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдмрдВрдЯреВ рдФрд░ рдХреНрд╡рд╛рд░реНрдЯрд╕ рд▓рд╛рдЗрдЯ 18 рд╕реНрдерд╛рдкрд┐рдд рд╣реИред


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


рд╣рдо рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдмреЛрд░реНрдб рд╡рд┐рдХреНрд░реЗрддрд╛ рд╕реЗ read_write_1G рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓реА рдФрд░ read_write_1G рдЖрд╡рд╢реНрдпрдХ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдирдпрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛? рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдирдпрд╛ рд╣реВрдБ, рдФрд░ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд┐рдВрд╕ рдХреЗ рдирд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореИрдк рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд╣реАрдВ рд╕реЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ freedom рднрдВрдбрд╛рд░ ( freedom-e-sdk рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ rocket-tools рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗ (рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рд▓рд┐рдкрд┐рдпреЛрдВ рдФрд░ рдмрд╣реБрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд╢реБрд░реВрдЖрдд), рдФрд░ рдлрд┐рд░ рдЪрд▓рд╛рдПрдВ


 RISCV=$(pwd)/../rocket-tools make -f Makefile.e300artydevkit verilog mcs 

рд▓рдХреНрд╖реНрдп verilog рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд╛рд▓ Verilog рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди verilog , рдФрд░ mcs BootROM mcs рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ рдХрд┐ mcs рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ Xilinx Vivado рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд BootROM рдХреЛ рдЙрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ Vivado рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдореЗрдиреВ рдЖрдЗрдЯрдо Quartus рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ -> рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ / рдирд┐рдХрд╛рд▓реЗрдВ ... freedom/builds/e300artydevkit/sifive.freedom.everywhere.e300artydevkit.E300ArtyDevKitConfig.v рдЬреЛрдбрд╝реЗрдВ freedom/builds/e300artydevkit/sifive.freedom.everywhere.e300artydevkit.E300ArtyDevKitConfig.v , рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреА рдЗрдХрд╛рдИ рд╕реЗрдЯ рдХрд░реЗрдВ: E300ArtyDevitKPGFPGPPG рдкрд░ рдЪрд╛рд▓реВ рдХрд░реЗрдВред рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреА рдЗрдХрд╛рдИ рд╕реНрд╡рддрдГ рдкреВрд░реНрдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕реВрдЪреА рдкрд╣рд▓реЗ рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрдЧреА)ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ AsyncResetReg , IOBUF рдореЙрдбреНрдпреВрд▓, рдЖрджрд┐ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ AsyncResetReg ред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреА рдЗрдХрд╛рдИ рдХреЛ рдмрджрд▓рдирд╛ рднреВрд▓ рдЧрдПред рдпрджрд┐ рдЖрдк рд╕реНрд░реЛрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ AsyncResetReg.v рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реАрдзреЗ AsyncResetReg.v рдлрд╝рд╛рдЗрд▓ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди IOBUF Xilinx рдХреЗ IP рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, freedom/rocket-chip/src/main/resources/vsrc/AsyncResetReg.v ред рдФрд░ plusarg_reader.v рдХреЛ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред


рд╕рдВрдХрд▓рди рдЪрд▓рд╛рдПрдВ рдФрд░ рдПрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:


 Error (10174): Verilog HDL Unsupported Feature error at plusarg_reader.v(18): system function "$value$plusargs" is not supported for synthesis 

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЧреИрд░-рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдПрдХ рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЙрдореНрдореАрдж рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред


plusarg_reader.v
 // See LICENSE.SiFive for license details. //VCS coverage exclude_file // No default parameter values are intended, nor does IEEE 1800-2012 require them (clause A.2.4 param_assignment), // but Incisive demands them. These default values should never be used. module plusarg_reader #(parameter FORMAT="borked=%d", DEFAULT=0) ( output [31:0] out ); `ifdef SYNTHESIS assign out = DEFAULT; `else reg [31:0] myplus; assign out = myplus; initial begin if (!$value$plusargs(FORMAT, myplus)) myplus = DEFAULT; end `endif endmodule 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╕рдВрднрд╡рддрдГ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рд╕рд┐рдореБрд▓реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдкрдврд╝рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЗрд╕реЗ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рддреЛ рдмрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рджреЗрддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ SYNTHESIS рдирд╛рдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред ifdef рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ `define SYNTHESIS рдХреЛ `define SYNTHESIS рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдзрд╛ рд╕рдкреНрддрд╛рд╣ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдмрд┐рддрд╛рдПрдВ рдХрд┐ рдХрд░реНрдиреЗрд▓ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕рдВрдХреНрд░рдордг рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рд╣реИ ...)ред рдореЗрд░реА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рди рджреЛрд╣рд░рд╛рдПрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЧреБрдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ, рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░-> рд╡реЗрд░рд┐рд▓реЙрдЧ рдПрдЪрдбреАрдПрд▓ рдЗрдирдкреБрдЯ рдЯреИрдм, SYNTHESIS рдореИрдХреНрд░реЛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдХрдо рд╕реЗ рдХрдо 1, <NONE> (рдЦрд╛рд▓реА рд▓рд╛рдЗрди) рдореЗрдВ рдирд╣реАрдВред


рдпрд╣рд╛рдБ! рдЕрдм рдХреНрд╡рд╛рд░реНрдЯрд╕ рд▓рд╛рдкрддрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд░ рд╢рдкрде рд▓реЗрддрд╛ рд╣реИ - рдЖрдЗрдбрд┐рдпрд╛ рдореЗрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреЛрд░реНрдЯрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЬрд╛рдирдирд╛


рд╣рдо рдЖрдпрд╛рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ, freedom рднрдВрдбрд╛рд░ рдХреЛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, sbt рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП, рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ sbt рд╢реЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ, рдкрд░реА рдХрдерд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЖрдзреЗ-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирд╣реАрдВ рдЦреЛрдЬрддрд╛ рд╣реИ - рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВред рдпрд╣рд╛рдБ рд╕реЗ рдорд┐рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА:


  • sbt рд╢реЗрд▓ рд╡рд┐рдВрдбреЛ рдЦреЛрд▓реЗрдВ
  • clean рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВ
  • рдмрд╛рдИрдВ рдУрд░ рд╣рд░реЗ рд░рдВрдЧ рдХрд╛ рдкреБрдирд░рд╛рд░рдВрдн рдмрдЯрди рджрдмрд╛рдПрдБ
  • sbt рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд╣рд▓реЗ рдХрдорд╛рдВрдб ++2.12.4 рджрд░реНрдЬ рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рд╕рднреА рд╕рдмрдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ Scala рд╡рд░реНрдЬрди 2.12.4 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рджреЗрдВ, рдлрд┐рд░ рд╣рдо compile рдЪрд▓рд╛рдПрдВрдЧреЗ
  • рд╕рднреА sbt рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдЗрдбрд┐рдпрд╛ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
  • рд▓рд╛рдн!, рдЕрдм backlight рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдЕрдм рддрдХ, рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдХрдо рд╕реЗ рдХрдо рдЕрд░реНрдз-рдореИрдиреБрдЕрд▓ рдореЛрдб рдореЗрдВред рд╡реИрд╕реЗ, рдХреЛрдИ quartus_ipcreate рдмрддрд╛рдУ, рд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ quartus_ipcreate рд╣реИ? рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЖрдИрдкреА рд╡реЗрд░рд┐рдПрд╢рди рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗрд╡рд▓ рдмреНрд▓реИрдХрдмреЙрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдХрд╛рд▓рд╛ рдкрд░ рд╣реЛрдЧреАред


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:


 fpga-shells () | +-src/main/scala | +- ip/intel <--     IP Variations | | | +- Intel.scala | +- shell/intel <--       | +- ZeowaaShell.scala src/main/scala | +- everywhere.e300artydevkit <--   "" ,    | +- zeowaa/e115 <--      "" SoC | +- Config +- FPGAChip +- Platform +- System 

рдЖрдкрдХреЛ Makefile.e300artydevkit рдХреЗ рд╕рдорд╛рди рдПрдХ рдореЗрдХрдлрд╛рдЗрд▓ рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:


Makefile.zeowaa-e115:


 # See LICENSE for license details. base_dir := $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST))))) BUILD_DIR := $(base_dir)/builds/zeowaa-e115 FPGA_DIR := $(base_dir)/fpga-shells/intel MODEL := FPGAChip PROJECT := sifive.freedom.zeowaa.e115 export CONFIG_PROJECT := sifive.freedom.zeowaa.e115 export CONFIG := ZeowaaConfig export BOARD := zeowaa export BOOTROM_DIR := $(base_dir)/bootrom/xip rocketchip_dir := $(base_dir)/rocket-chip sifiveblocks_dir := $(base_dir)/sifive-blocks include common.mk 

рдмрд╛рдЗрдВрдбрд┐рдВрдЧ


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ IOBUF рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рднреМрддрд┐рдХ "рд▓реЗрдЧ" (рдмреЙрд▓?) рдХреЛ рдорд╛рдЗрдХреНрд░реЛрдХреНрд░рд┐рдХрд┐рдЯ рдкрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ: рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд╡рд╛рд░реНрдЯрд╕ рд╡рд┐рдВрдбреЛ рдХреЗ рджрд╛рд╣рд┐рдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ, рд╣рдо "IOBUF" рдЖрдИрдкреА рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рддреБрд░рдВрдд ALTIOBUF рдирд╛рдордХ рдПрдХ рдШрдЯрдХ рдкреНрд░рд╛рдкреНрдд ALTIOBUF ред рдЪрд▓реЛ рд╡рд┐рд╡рд┐рдзрддрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, "рдПрдХ рджреНрд╡рд┐рджрд┐рд╢ рдмрдлрд░ рдХреЗ рд░реВрдк рдореЗрдВ" рдЪреБрдиреЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ iobuf рдирд╛рдордХ рдПрдХ рдореЙрдбреНрдпреВрд▓ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:


 // ... module obuf ( datain, oe, dataout); input [0:0] datain; input [0:0] oe; output [0:0] dataout; wire [0:0] sub_wire0; wire [0:0] dataout = sub_wire0[0:0]; obuf_iobuf_out_d5t obuf_iobuf_out_d5t_component ( .datain (datain), .oe (oe), .dataout (sub_wire0)); endmodule // ... 

рдЖрдЗрдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд▓реИрдХрдмреЙрдХреНрд╕ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦреЗрдВ:


 package ip.intel import chisel3._ import chisel3.core.{Analog, BlackBox} import freechips.rocketchip.jtag.Tristate class IOBUF extends BlackBox { val io = IO(new Bundle { val datain = Input(Bool()) val dataout = Output(Bool()) val oe = Input(Bool()) val dataio = Analog(1.W) }) override def desiredName: String = "iobuf" } object IOBUF { def apply(a: Analog, t: Tristate): IOBUF = { val res = Module(new IOBUF) res.io.datain := t.data res.io.oe := t.driven a <> res.io.dataio res } } 

рд╣рдо рдЯрд╛рдЗрдк Analog рдХреЗ рд╡реЗрд░рд┐рд▓реЛрдЧ рдЗрдирдЖрдЙрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ desiredName рд╡рд┐рдзрд┐ desiredName рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд░реНрдЧ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдмрд╛рдЗрдВрдбрд░реНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВред


рд╣рдореЗрдВ BootROM рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо ROM: 1-PORT (2048 x 32-рдмрд┐рдЯ рд╢рдмреНрдж, рдХреЗрд╡рд▓ рдПрдбреНрд░реЗрд╕ рд░рдЬрд┐рд╕реНрдЯрд░, rden рдкреЛрд░реНрдЯ рдмрдирд╛рдПрдБ) рдХреА рднрд┐рдиреНрдирддрд╛ рдмрдирд╛рдПрдБред рд╣рдо рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд▓реЙрдХ рдмрдирд╛рддреЗ рд╣реИрдВ rom , рдХреНрдпреЛрдВрдХрд┐ рддрдм рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ ROMGenerator рд╡рд░реНрдЧ рдХреЛ ROMGenerator : me рдмрдЬрд╛рдп ROMGenerator рдФрд░ рд╣рдорд╕реЗ рдЧрд╛рдпрдм (рдпрд╣ рдЕрднреА рднреА 1 рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ):


BootROM.v:


 module BootROM( input wire [10:0] address, input wire clock, input wire me, input wire oe, output wire [31:0] q ); rom r( .address(address), .clock(clock), .rden(me), .q(q) ); endmodule 

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


 srec_cat -Output builds/zeowaa-e115/xip.hex -Intel builds/zeowaa-e115/xip.bin -Binary -Output_Block_Size 128 

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рдореЗрдХрдлрд╛рдЗрд▓ рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:


рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 base_dir := $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST))))) BUILD_DIR := $(base_dir)/builds/zeowaa-e115 FPGA_DIR := $(base_dir)/fpga-shells/intel MODEL := FPGAChip PROJECT := sifive.freedom.zeowaa.e115 export CONFIG_PROJECT := sifive.freedom.zeowaa.e115 export CONFIG := ZeowaaConfig export BOARD := zeowaa export BOOTROM_DIR := $(base_dir)/bootrom/xip rocketchip_dir := $(base_dir)/rocket-chip sifiveblocks_dir := $(base_dir)/sifive-blocks all: verilog $(MAKE) -C $(BOOTROM_DIR) clean romgen || true srec_cat -Output $(BUILD_DIR)/xip.hex -Intel $(BUILD_DIR)/xip.bin -Binary -Output_Block_Size 128 include common.mk 

рдпрд╣ рдЪрд▓рддрд╛ рд╣реИ ^ W рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рд╣реИ


рддреЛ, рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдбрд┐рдмрдЧрд┐рдВрдЧ рд╣реИред рдмрд┐рд▓реНрд▓реА рдХреЛ рдкрд╣рд▓реЗ рдШрд░ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рд╢рд╛рдпрдж JTAG рдХреЛ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдиреНрдпреВрдирддрдо рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рддреЗ рд╣реИрдВ: рдмреВрдЯ рд╕реЗ рдмреВрдЯ, рдЬреАрдкреАрдЖрдИрдУ рд╕реЗ рдПрд▓рдИрдбреА рдХреЛ рдмреНрд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЬреЗрдЯреАрдПрдЬреА рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпреЛрдВ рдХреБрдЫ рднреА рд▓реЛрдб рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдмреНрд▓рд┐рдВрдХрд┐рдВрдЧ рдирд╣реАрдВред E300ArtyDevKit рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рдХрд░рдХреЗ E300ArtyDevKit рдЗрд╕рдореЗрдВ рдЪрд╛рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдБред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,


Config.scala:


 class DefaultZeowaaConfig extends Config ( new WithNBreakpoints(2) ++ new WithNExtTopInterrupts(0) ++ new WithJtagDTM ++ new TinyConfig ) class Peripherals extends Config((site, here, up) => { case PeripheryGPIOKey => List( GPIOParams(address = BigInt(0x64002000L), width = 6) ) case PeripheryMaskROMKey => List( MaskROMParams(address = 0x10000, name = "BootROM")) }) class ZeowaaConfig extends Config( new Peripherals ++ new DefaultZeowaaConfig().alter((site, here, up) => { case JtagDTMKey => new JtagDTMConfig ( idcodeVersion = 2, idcodePartNum = 0xe31, idcodeManufId = 0x489, debugIdleCycles = 5) }) ) 

рд╡рд┐рд╡рд░рдг E300 рд╕реЗ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рдФрд░ рдХрд╛рдЯреЗ рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╣реИ: рд╣рдо рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдХрд╣рд╛рдВ рд╣реЛрдЧрд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ RAM рдирд╣реАрдВ рд╣реИ (рдпрд╣ TinyConfig рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ TinyConfig рд╣реИ), рдПрдХ рдкрддрд╛ рд╕реНрдерд╛рди, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 32-рдмрд┐рдЯ рд╣реИ!


рдПрдХ рдлрд╝рд╛рдЗрд▓ рднреА рд╣реИ рдЬреЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдХреЛ рд╡рд╣рди рдХрд░рддреА рд╣реИред
System.scala:


 class System(implicit p: Parameters) extends RocketSubsystem with HasPeripheryMaskROMSlave with HasPeripheryDebug with HasPeripheryGPIO { override lazy val module = new SystemModule(this) } class SystemModule[+L <: System](_outer: L) extends RocketSubsystemModuleImp(_outer) with HasPeripheryDebugModuleImp with HasPeripheryGPIOModuleImp { // Reset vector is set to the location of the mask rom val maskROMParams = p(PeripheryMaskROMKey) global_reset_vector := maskROMParams(0).address.U } 

рджрд░рдЕрд╕рд▓, рд╣рдорд╛рд░реЗ "рдорджрд░рдмреЛрд░реНрдб" рдХрд╛ рд▓реЗрдЖрдЙрдЯ рддреАрди (рдЕрдм рддрдХ) рд╕рд░рд▓ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣реИ:
Platform.scala:


 class PlatformIO(implicit val p: Parameters) extends Bundle { val jtag = Flipped(new JTAGIO(hasTRSTn = false)) val jtag_reset = Input(Bool()) val gpio = new GPIOPins(() => new BasePin(), p(PeripheryGPIOKey)(0)) } class Platform(implicit p: Parameters) extends Module { val sys = Module(LazyModule(new System).module) override val io = IO(new PlatformIO) val sjtag = sys.debug.systemjtag.get sjtag.reset := io.jtag_reset sjtag.mfr_id := p(JtagDTMKey).idcodeManufId.U(11.W) sjtag.jtag <> io.jtag io.gpio <> sys.gpio.head } 

FPGAChip.scala:


 class FPGAChip(override implicit val p: Parameters) extends ZeowaaShell { withClockAndReset(cpu_clock, cpu_rst) { val dut = Module(new Platform) dut.io.jtag.TCK := jtag_tck dut.io.jtag.TDI := jtag_tdi IOBUF(jtag_tdo, dut.io.jtag.TDO) dut.io.jtag.TMS := jtag_tms dut.io.jtag_reset := jtag_rst Seq(led_0, led_1, led_2, led_3) zip dut.io.gpio.pins foreach { case (led, pin) => led := Mux(pin.o.oe, pin.o.oval, false.B) } dut.io.gpio.pins.foreach(_.i.ival := false.B) dut.io.gpio.pins(4).i.ival := key1 dut.io.gpio.pins(5).i.ival := key2 } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рдЪрд┐рд╕реЗрд▓ рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдорд╛рдорд▓рд╛ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рд░ рддрд╛рд░:


ZeowaaShell.scala
 object ZeowaaShell { class MemIf extends Bundle { val mem_addr = IO(Analog(14.W)) val mem_ba = IO(Analog(3.W)) val mem_cas_n = IO(Analog(1.W)) val mem_cke = IO(Analog(2.W)) val mem_clk = IO(Analog(2.W)) val mem_clk_n = IO(Analog(2.W)) val mem_cs_n = IO(Analog(2.W)) val mem_dm = IO(Analog(8.W)) val mem_dq = IO(Analog(64.W)) val mem_dqs = IO(Analog(8.W)) val mem_odt = IO(Analog(2.W)) val mem_ras_n = IO(Analog(1.W)) val mem_we_n = IO(Analog(1.W)) } } class ZeowaaShell(implicit val p: Parameters) extends RawModule { val clk25 = IO(Input(Clock())) val clk27 = IO(Input(Clock())) val clk48 = IO(Input(Clock())) val key1 = IO(Input(Bool())) val key2 = IO(Input(Bool())) val key3 = IO(Input(Bool())) val led_0 = IO(Output(Bool())) val led_1 = IO(Output(Bool())) val led_2 = IO(Output(Bool())) val led_3 = IO(Output(Bool())) val jtag_tdi = IO(Input(Bool())) val jtag_tdo = IO(Analog(1.W)) val jtag_tck = IO(Input(Clock())) val jtag_tms = IO(Input(Bool())) val uart_rx = IO(Input(Bool())) val uart_tx = IO(Analog(1.W)) // Internal wiring val cpu_clock = Wire(Clock()) val cpu_rst = Wire(Bool()) val jtag_rst = Wire(Bool()) withClockAndReset(cpu_clock, false.B) { val counter = Reg(UInt(64.W)) counter := counter + 1.U cpu_rst := (counter > 1000.U) && (counter < 2000.U) jtag_rst := (counter > 3000.U) && (counter < 4000.U) } cpu_clock <> clk25 } 

рдЗрд╕реЗ рддреАрди рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреНрдпреЛрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдЦреИрд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдРрд╕рд╛ рдерд╛ :) Shell рдХреЛ FPGAChip рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдпрд╣ рдерд╛ рдХрд┐ рд╢реЗрд▓ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмреЛрд░реНрдб рдкрд░ рдХреНрдпрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИрдВ (рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдЪрд┐рдк рдирд┐рд╖реНрдХрд░реНрд╖!), рдФрд░ FPGAChip рдЗрд╕ рддрдереНрдп рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ SoC рдореЗрдВ рд░рдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдареАрдХ рд╣реИ, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЛ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдиреЛрдЯ: ZeowaaShell (рдФрд░, рдЗрд╕рд▓рд┐рдП, Platform ) рдПрдХ RawModule , рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╣рд┐рдд clock рдФрд░ reset - рдпрд╣ "рд╡рд╛рдпрд░рд┐рдВрдЧ рдмреЛрд░реНрдб" рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рдФрд░, рд╢рд╛рдпрдж, рд╡рд┐рдкреБрд▓ рдЖрд╡реГрддреНрддрд┐ рдбреЛрдореЗрди рдХреЗ рд╕рд╛рде рдореБрд╢реНрдХрд┐рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛)ред рдЦреИрд░, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЫреЗрдиреА рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд░рдЬрд┐рд╕реНрдЯрд░ рдЖрджрд┐ рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


JTAG


JTAG рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХреБрдЫ рд╢рдмреНрджред рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд╛рд╕реНрдкрдмреЗрд░реАрдкреА 3 рдореЙрдбрд▓ рдмреА + рдерд╛, рдЗрд╕рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЕрдкрдиреЗ рдЬреАрдкреАрдЖрдИрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдерд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реЛ рдЧрдпрд╛ рд╣реИ : рддрд╛рдЬрд╛ рдУрдкрдирдУрд╕реАрдбреА рдореЗрдВ interface/sysfsgpio-raspberrypi.cfg рдХрд╛ рд╡рд░реНрдгрди рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдбрд┐рдмрдЧрд░ рдХреЛ рдмреНрд▓реЙрдХ (TCK = 11, TMS = 25, TDI = 10, TDO = 9, рдФрд░ 9) рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдЬреАрдПрдирдбреА рд╡реНрдпрд╛рдпрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВ) - рдпрд╣рд╛рдВ рдкрд┐рдирдЖрдЙрдЯ рдХрд░реЗрдВ ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлреНрд░реАрдбрдо.рдХреЙрдл рдХреЛ riscv-tests рднрдВрдбрд╛рд░ рд╕реЗ рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реБрдП , рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рд╛:


 adapter_khz 10000 source [find interface/sysfsgpio-raspberrypi.cfg] set _CHIPNAME riscv jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20e31913 set _TARGETNAME $_CHIPNAME.cpu target create $_TARGETNAME riscv -chain-position $_TARGETNAME -rtos riscv init halt echo "Ready for Remote Connections" 

рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдЖрд░рдПрдо рдХреЗ рддрд╣рдд рдирд┐рд░реНрдорд┐рдд riscv-openocd рдкреЛрд░реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдлреНрд░реАрдмреА рдкрд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ SiFive рд╕реЗ рдкреВрд░реНрд╡-рдЗрдХрдЯреНрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 ./configure --enable-remote-bitbang --enable-sysfsgpio 

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдореЛрдЯ рдмрд┐рдЯрдмреИрдВрдЧ рдХреЛ рдХреИрд╕реЗ рдЪрд▓рд╛рдирд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ ...


рдирддреАрдЬрддрди, рд╣рдо рд░реВрдЯ рд╕реЗ рдорд╛рд▓рд┐рдВрдХрд╛ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ


 root@ubuntu:~/riscv-openocd# ./src/openocd -s tcl -f ../riscv.tcl Open On-Chip Debugger 0.10.0+dev-00614-g998fed1fe-dirty (2019-06-03-10:27) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html adapter speed: 10000 kHz SysfsGPIO nums: tck = 11, tms = 25, tdi = 10, tdo = 9 SysfsGPIO nums: swclk = 11, swdio = 25 Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'. Info : SysfsGPIO JTAG/SWD bitbang driver Info : JTAG and SWD modes enabled Warn : gpio 11 is already exported Warn : gpio 25 is already exported Info : This adapter doesn't support configurable speed Info : JTAG tap: riscv.cpu tap/device found: 0x20e31913 (mfg: 0x489 (SiFive, Inc.), part: 0x0e31, ver: 0x2) Info : datacount=1 progbufsize=16 Info : Disabling abstract command reads from CSRs. Info : Examined RISC-V core; found 1 harts Info : hart 0: XLEN=32, misa=0x40001105 Info : Listening on port 3333 for gdb connections Ready for Remote Connections Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections 

3333 рдкреЛрд░реНрдЯ рдлреЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде SSH рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╛рдВрдЫрд┐рдд рдЖрдИрдкреА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛:


 ssh -L 3333:127.0.0.1:3333 ubuntu@192.168.1.104 

рд╣реЛрд╕реНрдЯ рдкрд░ рдЕрдм рдЖрдк RDBv32 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рддрд╣рдд GDB рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 $ ../../rocket-tools/bin/riscv32-unknown-elf-gdb -q (gdb) target remote :3333 Remote debugging using :3333 warning: No executable has been specified and target does not support determining executable automatically. Try using the "file" command. 0x00000000 in ?? () 

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


рдкрд╣рд▓рд╛ рдХреЛрдб


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ bootrom/xip/xip.S рдореЗрдВ рджреЗрдЦрд╛ рдерд╛, bootrom/xip/xip.S рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ bootrom/xip/xip.S рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 // See LICENSE for license details. // Execute in place // Jump directly to XIP_TARGET_ADDR .section .text.init .option norvc .globl _start _start: csrr a0, mhartid la a1, dtb li t0, XIP_TARGET_ADDR jr t0 .section .rodata dtb: .incbin DEVICE_TREE 

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдУрдПрд╕ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреНрд░реА (dtb рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА) рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд░реИрдо рдХреЗ рдмрд┐рдирд╛ рдУрдПрд╕ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЪрдордХрддреЗ рдкреНрд░рдХрд╛рд╢ рдмрд▓реНрдмреЛрдВ рд╕реЗ рдмрджрд▓ рджреЗрдВ:


рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
  .section .text.init .option norvc .globl _start _start: li a5, 0x64002000 li a1, 0x0F li a2, 0x01 li a3, 0x30 li a6, 0x10 li a7, 0x20 sw zero, 0x38(a5) // iof_en sw a1, 0x08(a5) // output_en sw a2, 0x00(a5) // value sw a1, 0x14(a5) // drive sw a3, 0x04(a5) // input_en // a0 <- timer // a1 <- 0x0F // a2 <- [state] // a3 <- 0x30 // a4 <- [buttons] // a5 <- [gpio addr] // a6 <- 0x10 // a7 <- 0x20 loop: li a4, 0x1000 add a0, a0, a4 bgtu a0, zero, loop lw a4, 0x00(a5) // value beq a4, a6, plus beq a4, a7, minus j store plus: srai a2, a2, 1 beq a2, zero, pzero j store pzero: li a2, 0x08 j store minus: slli a2, a2, 1 beq a2, a6, mzero j store mzero: li a2, 0x01 store: sw a2, 0x0c(a5) // value j loop 

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


рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ... рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ: рд╕рднреА рд░реЛрд╢рдиреА рдЪрд╛рд▓реВ рд╣реИрдВ, рд╡реЗ рдмрдЯрди рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдЪрд▓реЛ JTAG рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ: рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛рдЙрдВрдЯрд░ = 0x00000000 - рдХрд┐рд╕реА рддрд░рд╣ рд╕рдм рдХреБрдЫ рджреБрдЦреА рд╣реИред рд▓реЗрдХрд┐рди 0x64002000 рд╣рдорд╛рд░реЗ рдкрд╛рд╕ GPIO рд░рдЬрд┐рд╕реНрдЯрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:


GPIOCtrlRegs.scala
 // See LICENSE for license details. package sifive.blocks.devices.gpio object GPIOCtrlRegs { val value = 0x00 val input_en = 0x04 val output_en = 0x08 val port = 0x0c val pullup_en = 0x10 val drive = 0x14 val rise_ie = 0x18 val rise_ip = 0x1c val fall_ie = 0x20 val fall_ip = 0x24 val high_ie = 0x28 val high_ip = 0x2c val low_ie = 0x30 val low_ip = 0x34 val iof_en = 0x38 val iof_sel = 0x3c val out_xor = 0x40 } 

рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:


 (gdb) set variable *0x64002038=0 (gdb) set variable *0x64002008=0xF (gdb) set variable *0x64002000=0x1 (gdb) set variable *0x64002014=0xF (gdb) set variable *0x6400200c=0x1 

рддреЛ ... рдПрдХ рдПрд▓ рдИ рдбреА рдмрд╛рд╣рд░ рдЪрд▓рд╛ рдЧрдпрд╛ ... рдФрд░ рдЕрдЧрд░ 0x1 рдирд╣реАрдВ, рд▓реЗрдХрд┐рди 0x5 ... рдпрд╣ рд╕рд╣реА рд╣реИ, рдЕрдм рдПрд▓ рдИ рдбреА рдПрдХ рдХреЗ рдмрд╛рдж рд╕реЗ рдЬрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЙрд▓реНрдЯрд╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ 0x00 рд░рдЬрд┐рд╕реНрдЯрд░ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 (gdb) x/x 0x64002000 0x64002000: 0x00000030 //    (gdb) x/x 0x64002000 0x64002000: 0x00000020 //   (gdb) x/x 0x64002000 0x64002000: 0x00000010 //   (gdb) x/x 0x64002000 0x64002000: 0x00000000 

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


рд▓реЗрдХрд┐рди рд╣рдо рд▓реВрдк рдореЗрдВ рдХрддрд╛рдИ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди $pc=0x0000000 ?


 (gdb) x/10i 0x10000 0x10000: addi s1,sp,12 0x10002: fsd ft0,-242(ra) 0x10006: srli a4,a4,0x21 0x10008: addi s0,sp,32 0x1000a: slli t1,t1,0x21 0x1000c: lb zero,-1744(a2) 0x10010: nop 0x10012: addi a0,sp,416 0x10014: c.slli zero,0x0 0x10016: 0x9308 

рдХреНрдпрд╛ рд╣реИ рдкреЛрдХреЗрдореЙрди ??? рдореИрдВрдиреЗ рдРрд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд▓рд┐рдЦреЗ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдлреЗрдВрдХ рджрд┐рдпрд╛! рдЖрдЗрдП рдХрд░реАрдм рд╕реЗ рджреЗрдЦреЗрдВ:


 (gdb) x/10x 0x10000 0x10000: 0xb7270064 0x9305f000 0x13061000 0x93060003 0x10010: 0x13080001 0x93080002 0x23ac0702 0x23a4b700 0x10020: 0x23a0c700 0x23aab700 

рджреВрд╕рд░реА рдУрд░, рд╡рд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?


 $ ../../rocket-tools/bin/riscv32-unknown-elf-objdump -d builds/zeowaa-e115/xip.elf builds/zeowaa-e115/xip.elf:   elf32-littleriscv   .text: 00010054 <_start>: 10054: 640027b7 lui a5,0x64002 10058: 00f00593 li a1,15 1005c: 00100613 li a2,1 10060: 03000693 li a3,48 10064: 01000813 li a6,16 10068: 02000893 li a7,32 1006c: 0207ac23 sw zero,56(a5) # 64002038 <__global_pointer$+0x63ff0770> 10070: 00b7a423 sw a1,8(a5) 10074: 00c7a023 sw a2,0(a5) 10078: 00b7aa23 sw a1,20(a5) 1007c: 00d7a223 sw a3,4(a5) ... 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрд╡рд╛рд░реНрдЯрд╕ рдиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЙрдиреНрд╣реАрдВ рд╢рдмреНрджреЛрдВ рдХреЛ рд░рдЦрд╛ рд╣реИ рдЬреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдереЗ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдПрдВрдбрд┐рдпрдирдиреЗрд╕ рдмрджрд▓ рдЧрдИред рдЖрдк рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ Google рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реВрдВ , рдмреИрд╕рд╛рдЦреА рд╣рдорд╛рд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдмрд╕ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛


BootROM.v
 module BootROM( input wire [10:0] address, input wire clock, input wire me, input wire oe, output wire [31:0] q ); wire [31:0] q_r; rom r( .address(address), .clock(clock), .rden(me), .q(q_r) ); assign q[31:24] = q_r[7:0]; assign q[23:16] = q_r[15:8]; assign q[15:8] = q_r[23:16]; assign q[7:0] = q_r[31:24]; endmodule 

рддреЛ, рд╣рдо рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЪрдордХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред JTAG: $pc - , = 4, , output_en : set variable *0x64002008=0xF , c (continue) тАФ ! , . -, , тАж , output_en .


:


 Total logic elements 17,370 / 114,480 ( 15 % ) Total registers 8357 Total pins 16 / 281 ( 6 % ) Total virtual pins 0 Total memory bits 264,000 / 3,981,312 ( 7 % ) Embedded Multiplier 9-bit elements 4 / 532 ( < 1 % ) 

Chisel


...

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


All Articles