有关Nios的ModelSim仿真.docx
《有关Nios的ModelSim仿真.docx》由会员分享,可在线阅读,更多相关《有关Nios的ModelSim仿真.docx(22页珍藏版)》请在冰豆网上搜索。
![有关Nios的ModelSim仿真.docx](https://file1.bdocx.com/fileroot1/2022-11/15/b1691e37-79a3-46c8-a107-62b42793b823/b1691e37-79a3-46c8-a107-62b42793b8231.gif)
有关Nios的ModelSim仿真
Abstract
在剛學習NiosII時,每次在RunAsNiosIIHardware下方,看到RunAsNiosIIModelSim就覺得很好奇,NiosII明明是嵌入式系統,怎麼能用ModelSim仿真呢?
Introduction
使用環境:
QuartusII7.2SP3+NiosIIEDS7.2SP3+ModelSim-Altera6.1g+DE2(CycloneIIEP2C35F627C6)
用ModelSim對數字系統作仿真,這個大家都很熟悉,在(原創)如何解決在QuartusII無法使用ModelSim-Altera模擬的問題?
(SOC)(QuartusII)(ModelSim)與(原創)如何做functionalsimulation?
(SOC)(QuartusII)(ModelSim)都曾經討論過。
NiosII雖然是個嵌入式系統,但畢竟基於FPGA技術,所以比ARM這類hardcore多了使用ModelSim仿真的方式。
這也是Altera四大天王(QuartusII、NiosIIEDS、ModelSim-Altera、DSPBuilder)中的三大天王首次同台演出。
Altera在SimulatingNiosIIEmbeddedProcessorDesigns文件中,有談到如何用ModelSim-Altera對NiosII作仿真,不過一如以往,Altera的文件要在DE2能動,還是得做不少修改,昨晚弄了一晚也弄不出來,在大家常去的AlteraForum、NiosForum與EDACN的討論中發現,真正做出來的人並不多。
今天早上運氣好竟然成功了,趕快將心得記下來。
QuartusII與SOPCBuilder部分
Step1:
建立一個最簡單的NiosII系統
文件中的那個系統並不適合DE2,用了一定不能動,所以就自己建立一個最簡單的NiosII系統。
為了要簡單,就先使用onchipmemory與ledg與button就好,其他IP都先別用,以減少失敗的變因。
Step2:
JTAGUART設定
使用ModelSim-Altera仿真後,對於C的printf()要怎麼顯示呢?
這要對JTAGUART做設定。
Step3:
對PIO做初始值設定
Button本來是在runtime由user去決定,若你想在testbench就模擬user的按鍵,可在此設定,此步驟並非必須,只是demo可藉由此方式設定PIO的初始值。
Step4:
在SOPCBuilder設定ModelSim-Altera路徑
Tools->Options->Category:
HDLSimulator
Step5:
產生能仿真的NiosII系統
記得要將『Simulation.Createprojectsimulatorfiles』打勾。
Step6:
DE2_NIOS_ModelSim2.v/Verilog
1 /*
2 (C)OOMusou2008
3
4 Filename :
DE2_NIOS_ModelSim2.v
5 Compiler :
QuartusII7.2SP3
6 Description:
DemohowtosimulateNiosIIbyModelSim-Altera
7 Release :
08/02/20081.0
8 */
9
10 moduleDE2_NIOS_ModelSim2(
11 inputCLOCK_50,
12 input[3:
0]KEY,
13 output[8:
0]LEDG
14 );
15
16 wire CPU_CLK;
17 wire CPU_RESET;
18
19 Reset_Delay delay1(
20 .iRST(KEY[0]),
21 .iCLK(CLOCK_50),
22 .oRESET(CPU_RESET)
23 );
24
25 SDRAM_PLLPLL1(
26 .inclk0(CLOCK_50),
27 .c1(CPU_CLK)
28 );
29
30 nios_iiu0(
31 .clk(CPU_CLK),
32 .reset_n(CPU_RESET),
33 .in_port_to_the_button_pio(KEY),
34 .out_port_from_the_ledg_pio(LEDG)
35 );
36
37 endmodule
25行
SDRAM_PLLPLL1(
.inclk0(CLOCK_50),
.c1(CPU_CLK)
);
別被SDRAM_PLL嚇到了,只是借用這個PLL產生100Mhz的clock給NiosII用,你也可以自己重新產生一個100Mhz的clock而不用SDRAM_PLL。
QuartusII與SOPCBuilder部分已經完成,編譯後可燒進DE2。
NiosIIEDS部分
Step1:
建立HelloWorldproject
hello_world.c/C
1 #include
2 #include"system.h"
3 #include"altera_avalon_pio_regs.h"
4
5 intmain(){
6 inti;
7 printf("HellofromNiosII!
\n");
8
9 for(i= 0;i< 256;i++)
10 IOWR_ALTERA_AVALON_PIO_DATA(LEDG_PIO_BASE,i);
11
12 return 0;
13 }
LEDG_PIO_BASE這個巨集跟文件的不一樣,因為在SOPCBuilder中,我們已經使用了不同的名稱。
Step2:
修改SystemLibrary設定
由於我們使用的onchipmemory只有40K,正常的NiosII是無法執行的,所以必須做些設定,讓codesize變小。
在Altera原廠文件並沒有這一步,因為它用的是SDRAM夠大,根本不用考慮codesize的問題。
選擇不支援C++會讓codesize小一點,另外要勾選ModelSimonly,nohardware。
設定讓gcc編譯出的codesize小一點,若你對codesize最佳化有興趣,建議參考(原創)如何有效減少NiosIIEDS所編譯程式碼大小?
(ICDesign)(NiosII)。
Step3:
編譯HelloWorld且RunAsNiosIIModelSim。
NiosIIEDS部分已經完成,接著會出現ModelSim-Altera。
ModelSim-Altera部分
Step1:
編譯Verilog
QuartusII已經產生好ModelSim的macro,你只要打s就可重新編譯,這是最危險的時刻,若會失敗都是出在這個時候,我之前曾經使用友晶的NiosIIReferenceDesign來做仿真,但有些module無法編譯成功,目前原因還不明。
若成功編譯,會有以下的結果:
#ReadingC:
/altera/72/modelsim_ae/tcl/vsim/pref.tcl
#ReadingD:
/0Clare/DE2/DE2_NIOS_ModelSim2/nios_ii_sim/modelsim.tcl
#c:
/altera/72/quartus//sopc_builder
#c:
/altera/72/quartus//bin/perl
#Sopc_BuilderDirectory:
c:
/altera/72/quartus//sopc_builder
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#@@
#@@setup_sim.do
#@@
#@@Definedaliases:
#@@
#@@s--Loadalldesign(HDL)files.
#@@re-vlog/re-vcomandre-vsimthedesign.
#@@
#@@c--Re-compilememorycontents.
#@@BuildsC- andassembly-languageprograms
#@@(andassociatedsimulationdata-files
#@@suchasUARTsimulationstrings)for
#@@refreshingmemorycontents.
#@@DoesNOTre-generatehardware(HDL)files
#@@ONLYWORKSWITHLEGACYSDK(NottheNiosIDE)
#@@
#@@w--Sets-upwaveformsforthisdesign
#@@EachSOPC-Buildercomponentmayhave
#@@signals'marked' fordisplayduring
#@@simulation.Thiscommandopensawave-
#@@windowcontainingallsuchsignals.
#@@
#@@l--Sets-uplistwaveformsforthisdesign
#@@EachSOPC-Buildercomponentmayhave
#@@signals'marked' forlistingduring
#@@simulation.Thiscommandopensalist-
#@@windowcontainingallsuchsignals.
#@@
#@@jtag_uart_drive--displayinteractiveinputwindowforjtag_uart
#@@
#@@h--printthismessage
#@@
#@@
# OpenFile"nios_ii_sim.mpf"
#Loadingprojectnios_ii_sim
s
#ModelTechnologyModelSimALTERAvlog6.1gCompiler2006.08Aug12 2006
#--Compilingmodulebutton_pio_s1_arbitrator
#--Compilingmodulecpu_jtag_debug_module_arbitrator
#--Compilingmodulecpu_data_master_arbitrator
#--Compilingmodulecpu_instruction_master