YanaKernel0Bを、高位合成用C言語で実装しています。
高位合成用C言語で実装したYanaMips2011Cに、C言語(とアセンブリ言語)で実装したYanaKernel0Bを追加して、高位合成できるように変更します。
とりあえず、Vivadoで高位合成できましたし、MicroBoardに続いて、Artyでも実行できました。
また、ハードウェアで実装したカーネルに続いて、ハードウェアで実装したTaskについても、サンプルを実行できました。
なお、ハードウェアで実装したカーネルとソフトウェアで実装したTaskのインタフェースについては、命令「syscall」を使用していますが、次のようなインタフェースについては、検討中です。
まず、命令については、mMIPSのドキュメントから引用しますが、mMIPSの命令を用意して、mMIPSのCコンパイラを使用できるようにします。
- addiu addu subu
- and andi or ori xor xori
- beq bne
- jal jalr jr j
- lb lw sb sw
- lui
- slti sltiu slt sltu
- sll sra srl (1, 2, 8 bits)
さらに、次の命令を追加します。
また、次のレジスタを用意します。
あと、メモリ空間については、GXemulのドキュメントから引用しますが、デバイス「cons」を参考にして、文字を入出力できるようにします。
0x00000000 - 0x00003FFF |
0x00000000: reset vector |
0xB0000000 |
read: input 8 bits (non-blocking; returns 0 if no char was available) write: output 8 bits (blocking; ignore if 0) |
0xB0000010 |
read: ignore write: ignore |
次のアーカイブ・ファイルは、責任や保証を求めずに、個人的に用いてください。
次のような環境で、サンプルをビルドできました。
まず、次のようにファイルを用意します。
yana@cygwin ~ $ $HOME/opt/mips-elf/bin/mips-elf-gcc -v Using built-in specs. Target: mips-elf Configured with: /tmp/gccbuild/src/gcc/configure --disable-libssp --target=mips- elf --enable-languages=c,c++ --with-gnu-as --with-gnu-ld --with-newlib --disable -shared --enable-newlib -v --enable-multilib --disable-threads --enable-sjlj-exc eptions --enable-libstdcxx-allocator=malloc --prefix=/tmp/gccbuild/build/install --disable-libssp Thread model: single gcc version 4.3.2 (GCC) yana@cygwin ~ $ $HOME/opt/mips-elf/bin/mips-elf-ld -v GNU ld (GNU Binutils) 2.18 yana@cygwin ~ $ unzip -q mmips_noc.zip yana@cygwin ~ $ rm mmips_noc/lcc/lccdir/mips-* yana@cygwin ~ $ ln -s $HOME/opt/mips-elf/bin/mips-elf-as mmips_noc/lcc/lccdir/mips-as yana@cygwin ~ $ ln -s $HOME/opt/mips-elf/bin/mips-elf-ar mmips_noc/lcc/lccdir/mips-ar yana@cygwin ~ $ unzip -q yanakernel0binhlscwithyanamips20160711.zip yana@cygwin ~ $
次に、ディレクトリ「mmips_noc/lcc」などで、次のようにビルドします。
mmips_noc/lcc |
make clobber LCCDIR=$HOME/mmips_noc/lcc/lccdir PATH=$LCCDIR:$PATH make |
yanakernel0binhlsc/sample/yanamips2011c |
CC=$HOME/opt/mips-elf/bin/mips-elf-gcc LCCDIR=$HOME/mmips_noc/lcc/lccdir make $HOME/opt/mips-elf/bin/mips-elf-objcopy -O binary echo echo.bin perl -e 'binmode(STDIN);while(read(STDIN,$_,4)){printf("0x%08x,\n",unpack("N",$_))}' <echo.bin >../../machine/yanamips2011c/m_main.h |
なお、この環境では、ビッグ・エンディアンでビルドできました。
yana@cygwin ~/yanakernel0binhlsc/sample/yanamips2011c $ $HOME/opt/mips-elf/bin/mips-elf-readelf -h -l echo ELF Header: Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, big endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: MIPS R3000 Version: 0x1 Entry point address: 0x0 Start of program headers: 52 (bytes into file) Start of section headers: 9128 (bytes into file) Flags: 0x1000, o32, mips1 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 2 Size of section headers: 40 (bytes) Number of section headers: 14 Section header string table index: 11 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x001000 0x00000000 0x00000000 0x00c48 0x00c48 R E 0x1000 LOAD 0x001c48 0x00001c48 0x00001c48 0x00029 0x00240 RW 0x1000 Section to Segment mapping: Segment Sections... 00 .text 01 .data .sbss .bss yana@cygwin ~/yanakernel0binhlsc/sample/yanamips2011c $
次のような環境で、Vivadoで高位合成できました。
次のようなファイルを使用して、コマンド・プロンプトから高位合成します。
yana@cygwin ~/yanakernel0binhlsc/machine/yanamips2011c $ cat script.tcl open_project -reset arty set_top hlscore add_files hlscore.c open_solution -reset solution1 set_part {xc7a35ticsg324-1l} -tool vivado create_clock -period 10 -name default csynth_design exit yana@cygwin ~/yanakernel0binhlsc/machine/yanamips2011c $
次のような環境で、MicroBoardで実行できました。
まず、MicroBoardのUARTと接続するシリアル・ポートについて、次のように設定します。
また、ファイル「AES-S6MB-LX9-G-Other-Master-User-Constraints-File-UCF.zip」としてダウンロードした制約ファイル「Avt_S6LX9_MicroBoard_UCF_110804.ucf」について、基本は有効のようですが、次の部分を無効にします。
さらに、次のようなファイルを使用してMicroBoardで実行すると、シリアル・ポートに「(HDL)」と出力され、文字を入力すると、その文字が出力されます。
次に、ファイル「yanamips2011cinhlsc20160811hdl.zip」としてダウンロードしたファイル「hlscore.v」を削除して、Vivadoで高位合成したファイルを追加してから、MicroBoardで実行します。
次のような環境で、Artyで実行できました。
まず、ArtyのUARTと接続するシリアル・ポートについて、次のように設定します。
また、ファイル「Arty_Master.xdc」としてダウンロードした制約ファイルについて、基本は無効のようですが、次の部分を有効にします。
さらに、次のようなファイルを使用してArtyで実行すると、シリアル・ポートに「(HDL)」と出力され、文字を入力すると、その文字が出力されます。
次に、ファイル「yanamips2011cinhlsc20160811hdl.zip」としてダウンロードしたファイル「hlscore.v」を削除して、Vivadoで高位合成したファイルを追加してから、Artyで実行します。
ファイル「yanakernel0binhlscwithyanamips20160711.zip」について、ディレクトリ「yanamips2011c」では、カーネルをハードウェアで実装していますが、ディレクトリ「yanamips2011c_task」では、Taskもハードウェアで実装しています。
いわゆる「デバイス・ドライバ」のようなTaskで、文字の入力について、あるPortからソフトウェアで実装されたTaskをAcceptして、入力された文字をSetContextしてから、Replyするように、ハードウェアで実装しています。
ソフトウェアで実装されたTaskは、そのPortをCallすれば、通信するTaskが、ハードウェアで実装されているのか、それとも、ソフトウェアで実装されているか、ということを区別せずに、文字を入力できます。
とりあえずの比較ということで、Vivadoで高位合成した部分の文字の入力と出力について、Vivadoのロジック・アナライザを、Artyで実行してみました。
クロック |
100 |
136 |
137 |
139 |
140 |
197 |
1429 |
1486 |
ディレクトリ「yanamips2011c」 |
文字の入力 カーネルの開始 |
カーネルの終了 |
Task「task0」の再開 |
Task「task1」の再開 |
命令「sb」の終了 文字の出力 |
|||
ディレクトリ「yanamips2011c_task」 |
文字の入力 カーネルの開始 |
カーネルの終了 |
Task「task1」の再開 |
命令「sb」の終了 文字の出力 |
なお、Vivadoで高位合成した部分を制御する部分を変更していますが、変更する前は、次のような結果でした。
クロック |
100 |
136 |
139 |
154 |
157 |
395 |
5460 |
5698 |
ディレクトリ「yanamips2011c」 |
文字の入力 カーネルの開始 |
カーネルの終了 |
Task「task0」の再開 |
Task「task1」の再開 |
命令「sb」の終了 文字の出力 |
|||
ディレクトリ「yanamips2011c_task」 |
文字の入力 カーネルの開始 |
カーネルの終了 |
Task「task1」の再開 |
命令「sb」の終了 文字の出力 |
(C) 2016 Yana
Direction: Yana
HTML: Yana
Program: Yana
2016-08-11 release 2
2016-07-11 release 1
2016-06-11 release 0