FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

2015-10-01から1ヶ月間の記事一覧

MIPSがGoogleのIoT向けOS「Brillo」をサポート

CPU

Imagination Technologyのプレスリリースより。 imgtec.com BrilloというのはGoogleの開発しているIoT向けのOSだ。GoogleのOSと言えばAndroidだが、IoT向けにはこちらが本命なのかな? Brilloのサポート環境としては、ARM, x86, そしてMIPSだ。Googleが何故M…

フェッチのリクエストとQueueの実装

仕事が忙しいので、少しずつ実装している。命令フェッチを発行して、命令を取得してくるとそれをQueueに投入する部分だ。 基本的に128bitで命令をフェッチし、まずはアドレスバスの応答が返ってくる。それはif_queueに貯められ、IDが保存される。 このIDを参…

AXIルータ生成プログラムの作成(デコーダの記述)

CPU

AXIルータを自動生成できるよう、スクリプトを記述している。 今は、入力データに対して、どのようにアドレスデコーダを搭載して、パケットをルーティングするかというところだ。 $regions = Array[Array['START', Array['1011_1111_1100_XXXX_XXXX_XXXX_XXX…

継承しているポインタをスマートポインタにするときはshared_ptrを使う

C++

ISSの中でどうしてもunique_ptrに変更できないものがあった。それがInstEnvクラスだ。InstEnvクラスは、MIPS用とRISC-V用で両方ビルドするために、ベースクラスであるEnvBaseでpublic領域に宣言されており、それを継承したMipsEnvもしくはRiscvEnvにて実際に…

C++11のスマートポインタを導入(ISSに導入)

C++

msyksphinz.hatenablog.com いろいろ見ていくなかで、スマートポインタは便利そうなので、導入することにした。 github.com src/env.cpp m_regs = std::unique_ptr<Word_t[]>(new Word_t[100]); m_memory = std::unique_ptr<Memory> (new Memory ()); m_trace = std::unique_ptr<TraceInfo></traceinfo></memory></word_t[]>…

CODE FESTIVAL 2015 予選B に参加したけどやっぱりフルボッコ

まだプログラミングコンテストは参加し始めたばっかりだしね! code-festival-2015-qualb.contest.atcoder.jp ぱっとアルゴリズムとか、そのためにどのC++のSTLを使おうだとか、そのあたりをしっかりと特定できないあたりの実力不足を感じる。 でも、ある程…

初心者向けプログラミングコンテストに参加してもやっぱりフルボッコだった話

という訳で、次はAtCoder for Beginnersに参加してみた。 abc030.contest.atcoder.jp 最初の方は順調に解けたけど、最後の方になって、うまく動作しなくなった。 やはり、アルゴリズムを考えても、それが必要メモリ容量の中でリーズナブルに動くか、高速に動…

プログラミングコンテストに初参加したけどフルボッコにされた話

プログラミングはまあまあ出来ると思っていて、ちょっとプログラミングコンテストでもやってみるかと思って、ちょうどAtCoderのコンテストの通知があったので参加してみた。 kupc2015.contest.atcoder.jp 仕事があったので、仕事の合間に休み休み参加してい…

フェッチ部の実装とパイプトレースの出力

ようやくシミュレーションが出来るようになったので、どんどん追加していく。 端子の規則が出来ていなくて、余計な信号が出来てしまっていた。 github.com 例えば、EmacsのVerilogモードにて、クロックの名前がCPU_CLK, リセットの名前がCPU_RESETとなってい…

デバッグ環境の構築

最近仕事が忙しいので、殆ど家でプログラミングが出来ていないが、少しずつでも進めていこう。 CPUの設計をする際に、パイプラインの検証をするためのパイプラインロガーを接続していこう。 github.com ロガーとしては、実行した命令を表示するinst_loggerと…

C++11のスマートポインタを導入

C++

Effective Modern C++を読んでいたら、スマートポインタというのを見つけた。正直、何者なのか知らなかったので調査してみると、 メモリリークなどの誤動作を防ぐためのポインタ機構らしい。 例えば、スマートポインタを使うとdeleteが不要になったり、例外…

DPI-Cを使うための調査(Cygwinの環境でライブラリを構築)

msyksphinz.hatenablog.com 結局、libbfdをビルドすることは諦めて、ライブラリを使わずにhexファイルをロードする機構にした。とりあえずbfdは使わないのでビルドすることはできる。 github.com github.com まずは、hexファイルをロードしてシミュレーショ…

OpenCLのCode Exampleを試す (BandwidthTest)

developer.nvidia.com OpenCL Bandwidth Test This is a simple test program to measure the memcopy bandwidth of the GPU. It currently is capable of measuring device to device copy bandwidth, host to device and host to device copy bandwidth fo…

OpenCLのCode Exampleを試す (OpenCL device Query)

CUDA by Exampleも大体分かるようになったので、nVIDIAのコード例を一つずつ見ていこう。 CUDA by Example 汎用GPUプログラミング入門作者: Jason Sanders,Edward Kandrot,株式会社クイープ出版社/メーカー: インプレスジャパン発売日: 2011/02/14メディア: …

DPI-Cを使うための調査(DPIのライブラリをリンクして使...おうと思ったが)

msyksphinz.hatenablog.com QuestaSimのバージョンとか、ライブラリのバージョン、あるいは32ビットのライブラリか64ビットのライブラリかによって、使用するコンパイラも変えなければならないが、利用している環境が32ビットモードしか持っていないかったの…

AXIのインターコネクトジェネレータを作ろう

現在設計中のCPUは、バスはAXIで、周辺のモジュールに接続される構成になっている。 この構成の場合、いろんなものをAXIで接続して、マスターが複数、スレーブが複数の中で相互に通信をするためのインタコネクトが必要になる。 Xilinxの場合は以下だ。 AXI I…

DPI-Cを使うための調査

仕事も含めて、DPI-CでVerilog-HDLとC++を接続して使うというのは良くやってたんだけど、どうやら最新のマニュアルを読むと、最近の事情はだいぶ変わっているようだ。 ModelSimの場合は、DPI-Cを使う場合にはまず-dpiexportobjでスケルトンのようなオブジェ…

メタプログラミングRubyを買った

本屋に売っていたので買った。 メタプログラミングRuby 第2版作者: Paolo Perrotta,角征典出版社/メーカー: オライリージャパン発売日: 2015/10/10メディア: 大型本この商品を含むブログを見る Rubyであることにはあまり意味はなくて、コードを生成するコー…

HDLのシミュレーション環境の構築

さて、そろそろ自作CPUのシミュレーション環境を構築しよう。 コアの共通部はVerilog-HDLで記述し、デコーダのようなISSと共用できる部分はRubyから自動生成する。 github.com Verilog-HDLの部分を構築し、デコーダはISSから生成させる。 $arch_table[ 0] = …

nVidiaのGPUのアセンブリ言語を読む

GPU

msyksphinz.hatenablog.com 前回は、GPUのアセンブリ言語を出力する方法を勉強した。さて、これを読み解いてみよう。 オリジナルのソースコードは以下だ。 __kernel void vecAdd(__global int *a, __global int *b, __global int *c) { int gid = get_global…

GPU Proを読んでみる(自己組織化マップについて勉強)

GPU

GPGPUのプログラムの書き方とか、高速化のテクニックの基礎を学んだところで、いろいろ挑戦するために、まずは何をすればいいだろう。 そういえば昔こんな本を買ってみたんだったなということで、GPU Proの最初の章で登場している、自己組織化マップについて…

nVIDIAのOpenCLカーネルをコマンドラインからコンパイルするツールclccを試す

GPU

nVIDIAのGPGPUを使ってプログラムを書くために、毎回clCreateProgramWithSourceでコンパイルするのは面倒だ。 それに、逆アセンブルしてどういうカーネルになっているのかを確かめないと納得できない。 それでいろいろ調べていたのだが、nVIDIAのOpenCLカー…

ISSのシステムレジスタ値を設定できるようにする

ISS

xv6の解析中に、システムレジスタの初期値によって割り込みを発生させたりさせなかったりする設定が間違っており、うまく動作していない点があった。 そう考えてみると、今のISSにはシステムレジスタの初期値を設定できていないので、システムレジスタテーブ…

xv6が最初のプロセスを立ち上げるまでの勉強(プロセスのロードから立ち上が、、、らなかった)

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 さて、switchuvmの中で何が起きているのか見ていこう。 <FunctionCall 59150135: switchuvm(0x8010a994)> <FunctionCall 59150142: pushcli(0x80107538)> <FunctionCall 59150149: disableinterrupt(0x8010717c)> <FunctionCall 59150155: is_interruptible(0x8010713c)> </functioncall></functioncall></functioncall></functioncall>

CUDAのプログラムをOpenCLに移植(Ray-trace)

GPU

CUDA by Exampleには、レイトレースをCUDAで実装する方法が記載されている。 CUDA by Example 汎用GPUプログラミング入門作者: Jason Sanders,Edward Kandrot,株式会社クイープ出版社/メーカー: インプレスジャパン発売日: 2011/02/14メディア: 単行本(ソフ…

xv6が最初のプロセスを立ち上げるまでの勉強(mpmainの中を追いかける)

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 さて、mpmain()の中で何が起きているのか、階層トレースを見てみながら、追い掛けていこう。 まずは、schedulerが呼ばれて、enableinterrupt()により割り込みが有効になる。 <FunctionCall 59147183: mpmain(0x8010530c)> <Return: mpmain> <FunctionCall 59147195: cprintf(0x801007fc) ...> <Return: cprintf> </return:></functioncall></return:></functioncall>

テキストを読んで、xv6のブートプロセスを理解する(4: MIPS用にバイナリの配置を変更)

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 さて、前回まででページの初期化が出来るようになったのだが、途中で落ちてしまう。 ユーザプロセス用の初期化ルーチンで落ちているようだった。具体的には、以下のvm.c内のinituvm()内…

CUDAのプログラムをOpenCLに移植(ドット積)

GPU

CUDA by Exampleには、ドット積をCUDAで実装する方法が記載されている。 CUDA by Example 汎用GPUプログラミング入門作者: Jason Sanders,Edward Kandrot,株式会社クイープ出版社/メーカー: インプレスジャパン発売日: 2011/02/14メディア: 単行本(ソフトカ…

階層トレースモードにおいて、途中からトレースの表示を省略するモードを設ける

ISS

例えば、printfとかは内部で大量の関数を呼び出しており、関数の呼出関係のトレース図を作ると大変なことになる。 下の例では、Coremarkにおいて、cmp_complexから先を全て階層トレースとして出力した場合の結果だ。 <FunctionCall 51052: cmp_complex(0x80000180)> <FunctionCall 51061: calc_func(0x80000058)> <FunctionCall 51085: crcu16(0x800015c0)> <Return: crcu16> <Return: calc_func> </return:></return:></functioncall></functioncall></functioncall>

Hashicorp社の新しい仮想開発環境"Otto"でAppfileを記述してみた

前回までで、C++アプリケーションではOttoで自動的にプロジェクトを認識するのは難しいということが分かった。 では、Appfileを記述して、C++の環境を構築してみよう! 1. Appfileの文法を学ぶ Appfileについては、Hashicorp社のサイトに説明が載っている。 …