การจำลอง CPU เรียนรู้การเรียนรู้โดยการแก้ไข

ครั้งสุดท้ายที่ฉันดูโปรเซสเซอร์ RISC แบบ 16 บิตง่าย ๆ มุ่งเป้าไปที่นักเรียน มันต้องการความช่วยเหลือเล็กน้อยเกี่ยวกับเอกสารรวมทั้งมีไฟล์ที่หายไป แต่ฉันจัดการเพื่อให้ได้เพื่อจำลองการใช้งานฟรีบนเครื่องมืออินเทอร์เน็ตที่เรียกว่าสนามเด็กเล่น EDA คราวนี้ฉันจะพาคุณไปพร้อมกับรายละเอียดรหัสเช่นเดียวกับวิธีการจำลองการจำลอง

คุณจะต้องอ้างถึงการเผยแพร่ก่อนหน้านี้หากคุณไม่ได้ตรวจสอบแล้ว ไดอะแกรมรวมถึงตารางให้ภาพรวมระดับสูงที่จะช่วยให้คุณเข้าใจไฟล์ที่กล่าวถึงในโพสต์นี้

หากคุณต้องการที่จะตั้งโปรแกรมนี้บน FPGA ของแท้คุณจะมีงานทำเล็กน้อย หน่วยความจำรวมถึงการเริ่มต้นการเริ่มต้นจะดำเนินการในวิธีการที่ใช้งานได้ดีสำหรับการจำลองสถานการณ์อย่างไรก็ตามจะไม่ทำงานกับ FPGA ของแท้ อย่างไรก็ตามมาเริ่มกันเลย!

ไฟล์ by-file

หากคุณใช้ข้อมูลแต่ละรายการเป็นรายบุคคลไม่มีใครเข้าใจยากมาก นี่คือ Rundown ด่วน (ฉันใช้ชื่อข้อมูลที่ฉันใช้ในการจำลองอินเทอร์เน็ตของฉัน):

พารามิเตอร์.V – นี่เป็นเหมือนข้อมูลที่รวมไว้ซึ่งกำหนดคำจำกัดความพื้นฐานสำหรับทุกไฟล์อื่น ๆ

prog.v – นี่คือหน่วยความจำทิศทาง โมดูลง่ายๆจะต้องใช้ที่อยู่เช่นเดียวกับนำเสนอข้อมูลสำหรับที่อยู่นั้น Directive $ ReadMemb อ่านข้อมูลจากข้อมูล (test.prog)

register.v – ไฟล์ลงทะเบียน เกือบจะเหมือนกับหน่วยความจำทิศทางอย่างไรก็ตามมีสองพอร์ตเช็คเอาท์ทั้งสองเท่าที่คุณสามารถเขียนได้

data.v – หน่วยความจำ ram เกือบจะเหมือนกับการลงทะเบียน แต่มีขนาดใหญ่กว่าเช่นเดียวกับพอร์ตเช็คเอาท์เดียว มีรหัสการจำลองบางอย่างที่เปิดข้อมูลรวมถึงพิมพ์ความคิดเห็นของหน่วยความจำอย่างไรก็ตามฉันลบว่าเป็นเพียงเพื่อการดีบัก เนื้อหาเบื้องต้นมาจากไฟล์ test.data

Alu.V – คุณเชื่อว่าสิ่งนี้จะซับซ้อน แต่ก็ไม่ได้ มันใช้สองอินพุตเช่นเดียวกับบางสิ่งบางอย่างในการผลิตเอาต์พุต สิ่งที่ง่ายเหมือนเพิ่มหรือลบออก The Iways @ (*) บอก Verilog ไม่ให้ทำตรรกะที่โอเวอร์คล็อกสำหรับสิ่งนี้ มันจะกลายเป็นประตูง่าย ๆ เช่นเดียวกับ muxes

DataPath_Unit.v – นี่เป็นหนึ่งในไฟล์ที่ซับซ้อนมากขึ้นแม้ว่าหากคุณขุดมันคุณจะเห็นว่าเป็นกลุ่มส่วนใหญ่ ข้อมูลนี้สร้างทรัพยากรทั้งหมด (เช่นการลงทะเบียนเช่นเดียวกับความทรงจำ) รวมถึงสายต่อกัน

control_unit.v – อีกหนึ่งโมดูลที่ยาวกว่านี้เพียงแค่ใช้ตารางทิศทางการตั้งค่าบรรทัดควบคุมตามคำสั่งปัจจุบัน

alucontrol.v – ข้อมูลนี้ถอดรหัสคำแนะนำสำหรับ alu มันหายไปในโพสต์ต้นฉบับ ผิดปกติมีอีกหนึ่งซีพียูที่คล้ายกันในเว็บไซต์เดียวกันที่มีไฟล์ alucontrol แต่มันชัดเจนสำหรับชุดทิศทางที่แตกต่างกัน อย่างไรก็ตามการเริ่มเก็บข้อมูลนั้นรวมถึงการใช้ตารางสไตล์ฉันก็สามารถสร้างมันขึ้นใหม่ได้ หาก [FPGA4Students] แก้ไขสิ่งนี้ไฟล์อาจดูแตกต่างอย่างมาก

Design.sv – ข้อมูลนี้จำเป็นสำหรับการจำลอง EdaPlayGround ที่ฉันใช้ มันมีองค์ประกอบระดับบนสุด (เส้นทางข้อมูลรวมถึงชุดควบคุม) เนื่องจาก EdaPlayGround ประมวลผลไฟล์นี้เท่านั้นจึงเป็นสิ่งจำเป็นสำหรับการรวมไฟล์อื่นที่กล่าวถึงข้างต้น สิ่งนี้ทำให้คำเตือนบางอย่างตั้งแต่แต่ละคนมีคำสั่ง Timescale อย่างไรก็ตามนี่เป็นสิ่งที่ไม่เป็นอันตราย

Testbench.sv – Testbench ไม่ได้เป็นส่วนหนึ่งของการออกแบบที่แท้จริงอย่างไรก็ตามเพียงแค่ตั้งค่าการจำลองเช่นเดียวกับการรวบรวมผลลัพธ์ ฉันต้องแก้ไขมันเล็กน้อยเพื่อทำงานกับ EdaPlayground อย่างไรก็ตามการดำเนินการเหมือนกัน มันแค่สร้างซีพียูให้ฟีดนาฬิกาเช่นเดียวกับให้มันวิ่งไปสักพัก โปรแกรมทดสอบและเนื้อหาหน่วยความจำอยู่ใน test.prog รวมถึงการทดสอบ. DATA

การจำลอง

คุณสามารถทำหนึ่งในสองสิ่ง คุณสามารถเปิดสำเนาสไตล์ที่พร้อมใช้งานได้ แต่อาจไม่ใช่ตัวเลือกที่ดีที่สุดของคุณ ฉันขอแนะนำให้คุณเพียงไปที่ EdaPlayground และสร้างโครงการ Verilog ใหม่ จากนั้นเริ่มย้ายไฟล์ไปจากโพสต์ต้นฉบับ คุณจะพบข้อผิดพลาดเช่นเดียวกับไฟล์ที่หายไป ดูว่าคุณสามารถแก้ไขได้กี่ตัว หากคุณนิ่งงันคุณสามารถใช้สำเนาของฉันเพื่อช่วยคุณได้หากคุณนิ่งงัน คุณจะค้นพบวิธีนี้มากขึ้น

หากคุณเลือกที่จะลองใช้ที่นี่เป็นเคล็ดลับเล็กน้อยเกี่ยวกับ EdaPlayground คุณไม่ต้องการ UVM / OVM ที่เลือกหรือไม่ต้องการไลบรารีอื่น ๆ ประเภทใด ๆ ฉันใช้ Icarus Verilog 0.9.7 อย่างไรก็ตามคุณอาจใช้เครื่องมือ Verilog ประเภทใดก็ได้ คุณต้องการตรวจสอบช่องทำเครื่องหมาย Epwave เช่นเดียวกับที่คุณต้องการที่จะเพิ่มสิ่งนี้ลงในส่วน inital ของ testbench:

อักษรย่อ
เริ่ม
$ dumpfile (“dump.vcd”);
$ dumpvars;
ใช้ตัวบ่งชี้ + ถัดจากแท็บชื่อข้อมูลเพื่อสร้างไฟล์ใหม่ EdaPlayGround มีขีด จำกัด สิบไฟล์ต่อบานหน้าต่าง โปรดจำไว้ว่าคุณจะต้องรวมไฟล์. ev ประเภทใด ๆ ที่คุณผลิตใน testbench.sv หรือ design.sv คุณไม่ต้องการที่จะรวมไฟล์ข้อมูลเนื่องจากไฟล์อื่นใช้ประโยชน์ทางอ้อม

วิ่ง!

เมื่อคุณมีข้อผิดพลาดทั้งหมดทำงานแล้วคุณสามารถกด RUN ได้เช่นเดียวกับที่คุณจะได้รับโปรแกรมดูรูปคลื่น, Epwave คุณ havE เพื่อเพิ่มสัญญาณของอัตราดอกเบี้ยเพื่อให้คุณสามารถดูซีพียูที่ทำงานได้ มันจะสนุกที่จะเพิ่มอุปกรณ์ I / O บางอย่างในหน่วยความจำหรือบางพอร์ตการดีบักดังนั้นคุณอาจดูสิ่งที่ดีกว่านิดหน่อย ฉันมักจะดูเคาน์เตอร์โปรแกรมรวมถึงการลงทะเบียนเขียนพอร์ตเพื่อรับแนวคิดของสิ่งที่เกิดขึ้นภายใน

รหัสเดิมมีโปรแกรมที่ใช้คำแนะนำอย่างมาก ฉันแสดงความคิดเห็นมันเช่นเดียวกับแทนที่ด้วยสิ่งนี้:

0000_0100_0000_0000 // 0000: ตัน r0 <- mem (r2 + 0) ตั้งแต่ r2 = 0 สิ่งนี้ทำให้ 1 ใน r0 0000_0100_0100_0000 // 0002: ตันที่แน่นอนเหมือนกันใน R1 (R1 จะมี 1) // Place 8 (ไบต์), 4 (Word): 0010_0000_0101_0000 // 0004: R2 = R0 + R1 0001_0010_1000_0000 // 0006: MEM [R1] = R2 (นั่นคือ MEM [1] = R2 0000_0010_0000_0000 // 0008: R0 = Mem [R1] 1101_0000_0000_0011 // 000A: ข้ามไปที่วาง # 4 (CPU จะทวีคูณโดย 2 เช่นเดียวกับการเพิ่ม 2) // ไม่มีทิศทางที่ 000C อย่างไรก็ตามพีซีจะอยู่ที่นั่นในขณะที่กระบวนการมันกระโดด คุณควรจะสามารถปฏิบัติตามด้วยมูลค่าที่เพิ่มขึ้นในการเขียนหน่วยความจำรวมถึงดูวงจรเคาน์เตอร์โปรแกรมกลับไปที่ 4 พร้อมลูปแต่ละครั้ง นี่คือเซสชั่นทั่วไป: ฉันออกจากสัญญาณภายในอย่างมาก แต่คุณสามารถเห็นได้ว่าที่อยู่หน่วยความจำ 1 ถูกตั้งค่าเป็น 2 เช่นเดียวกับ 3 ในการวนซ้ำสองครั้งแรกของลูป จบเกม นี่เป็นซีพียูวิชาการที่ยอดเยี่ยมหรือไม่? ฉันไม่แน่ใจ. CPU ที่ง่ายกว่านี้มีอยู่ แต่บ่อยครั้งที่พวกเขามักจะเล็กเพราะพวกเขายุ่งยากหรือพวกเขาไม่สามารถทำได้อย่างมาก อะไรก็ตามที่ท้าทายยิ่งกว่านี้มีแนวโน้มมากที่สุดที่จะกัดมือใหม่ ในขณะที่ฉันเชื่อว่าคุณควรมีความเข้าใจพื้นฐานของ Verilog พื้นฐานก่อนที่คุณจะจัดการกับสิ่งนี้เอกสารนี้เป็นลักษณะที่กระจัดกระจายเล็กน้อย (และสับสน) ในบางพื้นที่ เห็นได้ชัดว่ามันเป็นสิ่งที่ดีมากเนื่องจากฉันทำงานได้ แต่ถ้าคุณเพิ่งเริ่มต้นคุณน่าจะขอบคุณมากขึ้นช่วยเพิ่มขึ้นเล็กน้อยเช่นเดียวกับคำอธิบาย คุณมีซีพียูวิชาการที่ต้องการหรือไม่? ฉันยังคงมองหาคนที่ "ถูกต้อง"