FPGA : Avalon bus simulation

    หลายท่านคงเคยประสบปัญหาที่ว่า เคยสร้างสร้าง Slave IP ของตัวเองซึ่งต่อกับ Avalon bus แล้วต้องการ simulate IP ที่เขียนมาเพื่อทดสอบฟังค์ชั่นต่างๆ ที่ออกแบบมา ซึ่งโดยปกติแล้วทาง intelFPGA ได้เตรียม IP ไว้สำหรับ verify โดยเฉพาะ เรียกว่า BFM (Bus Function Models) แต่ BFM นั้นค่อนข้างยุ่งยากซับซ้อนทำให้ยากต่อการนำมาใช้งาน บทความนี้จะนำเสนอวิธีการ verify IP ที่เราเขียนขึ้นมาโดยใช้วิธีอื่นๆนอกจากการใช้ BFM IP ของ intelFPGA

 

Note : 

1. ตัวอย่างนี้เพื่อเป็นการแนะนำวิธีการ simulate ดังนั้นจึงขอยกตัวอย่างการ simulate IP ง่ายๆ อย่าง GPIO ซึ่งเราจะใช้ IP ของ intelFPGA ที่ชื่อว่า PIO intelFPGA IP

2. บทความนี้จะเน้นไปที่วิธี simulation IP ดังนั้นจะขอไม่กล่าวถึงวิธีการสร้าง Avalon Slave IP ที่เป็นของเราเอง 

 

เริ่มต้นจากสร้างโปรเจค Quartus ขึ้นมาแล้วคลิกไปที่ Tool -> Platform Designer เพื่อสร้าง Qsys platform

 

ในหน้า Platform Designer ให้คลิกไปที่ New component เพื่อสร้าง Avalon Master interface

 

จากนั้นสร้าง Avalon Master interface โดยคลิกไปที่ Templates -> Add Avalon-MM Simple Master

 

ที่ Component Type ตั้งชื่อ component ตามที่เราต้องการในที่นี้ตั้งชื่อ AvalonSimpleMaster

 

เพิ่ม AvalonSimpleMaster และ IP ที่เราต้องการ simulate เข้า (ในตัวอย่างนี้จะเพิ่ม PIO intelFPGA IP)

 

โดยรวมแล้ว Qsys platform อย่างง่ายที่เราสร้างขึ้นจะเป็นดัง block diagram ด้านล่าง โดยเราจะควบคุม PIO intelFPGA IP ผ่านทาง Avalon Master bus ที่เราสร้างขึ้นมา

 

ทำการ save Qsys project โดยไปที่ File -> Save

 

จากนั้นคลิกไปที่ General HDL

ในเมนู Simulation ที่ Create simulation model ให้เลือก VHDL หรือ verilog (เพื่อให้ tool สร้าง simulation ไฟล์ให้เรา)

 

เมื่อ Generate เสร็จเรียบร้อยให้ไปที่โฟล์เดอร์ simulation/mentor จะเห็นว่ามีไฟล์ msim_setup.tcl ขึ้นมา

 

จากนั้้นให้เราสร้าง testbench ไฟล์ขึ้นมา (ในที่นี้ตั้งชื่อว่า tb_QSYS_PLATFORM.vhd) และนำไปวางไว้ที่โฟล์เดอร์ simulation

 

ภายใน testbench ไฟล์ให้ทำการเชื่อมต่อ Qys platfrom ที่เราต้องการ simulate เข้ากับ Avalon Master Bus (signal) ที่เราเตรียมไว้

 

เพิ่มส่วนควบคุม Avalon Master Bus ตามโด้ดด้านล่าง (single write cycle) โดยโค้ดด้านล่างจะทำการเปลี่ยน direction ของ PIO ให้เป็น output จากนั้นก็จะ set output ให้เป็น  0x55 -> 0xAA ตามลำดับ

 

เปิดไฟล์ msim_setup.tcl แล้วแก้ชื่อ TOP_LEVEL_NAME ให้เป็นชื่อ testbench ไฟล์ที่เราสร้างขึ้น (tb_QSYS_PLATFORM)

msim_setup.tcl ก่อนแก้ SYSTEM_INSTANCE_NAME

msim_setup.tcl หลังแก้ SYSTEM_INSTANCE_NAME

จากนั้นที่ alias com ให้เพิ่ม tb_QYS_PLATFORM.vhd เข้าไปด้วย

 

เปิด Modelsim ขึ้นมา แล้วไปที่ simulation/memtor (ที่อยู่ของไฟล์ msim_setup.tcl)

ที่ console ให้พิมพิ์ do msim_setup.tcl (tool จะทำการสร้างโปรเจค simulation ขึ้นมา)

 

พิมพิ์ com เพื่อ compile ไฟล์ต่างๆ ที่สำคัญสำหรับการ simulate

 

จากนั้นพิมพิ์ ld เพื่อเริ่มต้นการ simulate

 

เมื่อสั่ง run จะเห็นว่าเราสามารถสั่งงาน Avalon Slave IP (PIO intelFPGA IP) ที่เราสร้างขึ้นมาได้

ในตัวอย่างด้านล่างได้ทดสอบให้ PIO ออก output 0x55 -> 0xAA ตามลำดับ (ดูที่สัญญาญชื่อ pio_0_external_connection_export)

 

เพิ่มเติม : 

เราสามารถใช้ procedure และ package มาช่วยให้เราควบคุม sequence การ simulate ได้ง่ายขึ้นตามโค้ดด้านล่าง

 

จากนั้นที่ process เราก็จะได้โค้ดที่อ่านแล้วเข้าใจง่ายกว่าโค้ดด้านบนพอสมควร ซึ่งเหมาะกับการใช้งานสำหรับการนำไป simulate Slave IP ที่มีความยุ่งยากซับซ้อนกว่า PIO

 

 

จบไปกับบทความ Avalon bus simulation หวังว่าจะได้ประโยชน์อะไรบ้างจากบทความนี้ไม่มากก็น้อยนะครับ 

 

ผู้อ่านท่านใดมีความคิดเห็น, คำแนะนำ, ข้อเสนอแนะและคำถามสามารถสอบถามเพิ่มเติมทางอีเมล์ ndrs@ndrsolution.com ได้เลยครับ ทาง NDRS เราจะมีผู้เชี่ยวชาญมาคอยแบ่งบันความรู้เรื่อยๆ  และหากกำลังท่านกำลังมองหาผู้เชี่ยวชาญเพื่อมาช่วยแก้ปัญหาให้กับผลิตภัณฑ์อิเล็กทรอนิกส์สามารถติดต่อผ่านเราได้ทุกช่องทาง ไม่ว่าจะเป็นอีเมลล์ หรือ facebook ครับ