FPGA開発日記

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

DIGITAL ELECTRONICS NOTESをやってみる (7. 組み合わせ回路)

以下のデジタル回路の問題をやってみる。続き。

lancamentomerlo.my.canva.site

  • Q: エンコーダとマルチプレクサの違いは何ですか
  • A: エンコーダはマルチプレクサと似ているが、マルチプレクサはN個の入力に対して1ビットの出力を生成する。一方でエンコーダは$2N$の入力に対して$N$ビットの出力を生成する。

  • Q: プライオリティエンコーダとシンプルなエンコーダの違いは何ですか?

  • A: シンプルなエンコーダは、$2N$のビットがワンホットであることを想定している。一方でプライオリティエンコーダは、ビット列に優先度があり、例えば最上位ビットに優先度が与えられ、I3=1, I2=1の場合I3が優先される。

  • Q: リングオシレータとは何ですか?ゲートの遅延が2psのNOTゲートを3つ連結した場合の、リングオシレータの周波数はいくつになりますか。

  • A: リングオシレータは、奇数個のNOTゲートをリング状に接続する。リングオシレータ全体の遅延はNOTゲートの数なので、これが2回分通過するので、NOTゲートの数x2だけ遅延が発生する。つまり、6*2ps=12psの遅延が発生している。

  • Q: 半加算器を用いて全加算器を設計してください。

  • A: Sum = A XOR B XOR Carry / C = AB + BC + ACなので、2つの半加算器とORゲートを用いて設計できる。
  • Q: 4:1マルチプレクサを用いて全加算器を設計してください。
  • A: Sum = A XOR B XOR C / Carry = AB + BC + ACなので、そのようにマルチプレクサを設計する。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

Chipyard 1.8.1のインストール方法がかなり変わっていた

久しぶりにChipyardでChiselのデザインを生成しようとしたら、Version 1.8.1から随分と環境が変わっていた。

chipyard.readthedocs.io

Dockerfileも動かなくなっていてびっくりしたのだが、どうやらパッケージマネージャについては、Condaというものをインストールしなければ動かないらしい。

curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh"
bash Mambaforge-$(uname)-$(uname -m).sh

なんかインストールされた。

Shellを再起動する必要がある。一応インストールされたようだ。

$ conda --version
conda 22.11.1

これはChipyardとは関係ないらしい。おまじない。

conda install -n base conda-lock
conda activate base

次にChipyardディレクトリ上でツールのセットアップを行う。

./build-setup.sh riscv-tools

これでRISC-V Toolsのビルドができる。

. ./env.sh
cd sims/verilator
make CONFIG=RocketConfig debug   # Rocket-Chipのデザイン生成

Chipyardにおけるコンフィグレーション毎のPLICのインタフェースの違い

PLICの実装をいろいろチェックしたくて、Chipyardで生成される構成をチェックしている。

  • RocketChipのシングルコア構成。割込み挿入インタフェース auto_int_in_0は1ビットのみ。出力はauto_int_out_1_0 / auto_int_out_0_0の2ビット。
module TLPLIC(
  input         clock,
  input         reset,
  input         auto_int_in_0,
  output        auto_int_out_1_0,
  output        auto_int_out_0_0,
  output        auto_in_a_ready,
  input         auto_in_a_valid,
  input  [2:0]  auto_in_a_bits_opcode,
  input  [2:0]  auto_in_a_bits_param,
  input  [1:0]  auto_in_a_bits_size,
  input  [7:0]  auto_in_a_bits_source,
  input  [27:0] auto_in_a_bits_address,
  input  [7:0]  auto_in_a_bits_mask,
  input  [63:0] auto_in_a_bits_data,
  input         auto_in_a_bits_corrupt,
  input         auto_in_d_ready,
  output        auto_in_d_valid,
  output [2:0]  auto_in_d_bits_opcode,
  output [1:0]  auto_in_d_bits_size,
  output [7:0]  auto_in_d_bits_source,
  output [63:0] auto_in_d_bits_data
);
  • RocketChipの2コア構成。割込み挿入インタフェース auto_int_in_0は1ビットのみ。出力はauto_int_out_[3-1]_0の4ビット。
module TLPLIC(
  input         clock,
  input         reset,
  input         auto_int_in_0,
  output        auto_int_out_3_0,
  output        auto_int_out_2_0,
  output        auto_int_out_1_0,
  output        auto_int_out_0_0,
  output        auto_in_a_ready,
  input         auto_in_a_valid,
  input  [2:0]  auto_in_a_bits_opcode,
  input  [2:0]  auto_in_a_bits_param,
  input  [1:0]  auto_in_a_bits_size,
  input  [9:0]  auto_in_a_bits_source,
  input  [27:0] auto_in_a_bits_address,
  input  [7:0]  auto_in_a_bits_mask,
  input  [63:0] auto_in_a_bits_data,
  input         auto_in_a_bits_corrupt,
  input         auto_in_d_ready,
  output        auto_in_d_valid,
  output [2:0]  auto_in_d_bits_opcode,
  output [1:0]  auto_in_d_bits_size,
  output [9:0]  auto_in_d_bits_source,
  output [63:0] auto_in_d_bits_data
);
  • RocketChipの4コア構成。割込み挿入インタフェース auto_int_in_0は1ビットのみ。出力はauto_int_out_[7-1]_0の8ビット。
module TLPLIC(
  input         clock,
  input         reset,
  input         auto_int_in_0,
  output        auto_int_out_7_0,
  output        auto_int_out_6_0,
  output        auto_int_out_5_0,
  output        auto_int_out_4_0,
  output        auto_int_out_3_0,
  output        auto_int_out_2_0,
  output        auto_int_out_1_0,
  output        auto_int_out_0_0,
  output        auto_in_a_ready,
  input         auto_in_a_valid,
  input  [2:0]  auto_in_a_bits_opcode,
  input  [2:0]  auto_in_a_bits_param,
  input  [1:0]  auto_in_a_bits_size,
  input  [9:0]  auto_in_a_bits_source,
  input  [27:0] auto_in_a_bits_address,
  input  [7:0]  auto_in_a_bits_mask,
  input  [63:0] auto_in_a_bits_data,
  input         auto_in_a_bits_corrupt,
  input         auto_in_d_ready,
  output        auto_in_d_valid,
  output [2:0]  auto_in_d_bits_opcode,
  output [1:0]  auto_in_d_bits_size,
  output [9:0]  auto_in_d_bits_source,
  output [63:0] auto_in_d_bits_data
);

DIGITAL ELECTRONICS NOTESをやってみる (6. 組み合わせ回路)

以下のデジタル回路の問題をやってみる。続き。

lancamentomerlo.my.canva.site

  • Q: 組合せ回路と順序回路の違いは何ですか?
  • A: 任意の瞬間の出力が、その瞬間の入力にのみ依存する回路を組合せ回路と呼ぶ。したがって、これらの回路には記憶素子がない。半加算器、全加算器、マルチプレクサ、デコーダなどがその例である。一方、任意の瞬間の出力が、現在の瞬間の入力と過去の出力値の両方に依存する回路を逐次回路と呼ぶ。 そのため、過去の値を記憶するために何らかの記憶素子を持つ。順次回路の例として、フリップフロップレジスタ、カウンタなどがある。

  • Q: マルチプレクサとデマルチプレクサの違いは何ですか?

  • A: n to 1マルチプレクサ、略してMUXは、n個の入力から1つを選んで1つの出力に導くことができるデバイスである。
  • デマルチプレクサ(略してDeMUX)は、基本的に入力と出力が逆のマルチプレクサである。1対nのDeMUXの場合、1つの入力と、その入力を通すためのn個の出力がある。

  • Q: 2:1マルチプレクサを使用して4:1 MUXを設計してください。

  • A: 4:1 MUXは、以下のように2:1 MUXを使用して設計することができる。

  • Q: エンコーダーデコーダーの違いは何ですか?

  • A: エンコーダーは、人間が理解できる言語を機械が理解できる言語に変換するものである。エンコーダは、与えられたn個の入力を受けて、より少ない数の出力にエンコードします。8→3エンコーダは、上記の3→8デコーダと全く逆のことをすることができる。8つの入力があり、それぞれを3ビットのバイナリ出力にエンコードすることができる。デコーダは、機械が理解できる言語を人間が理解できる言語に変換するものである。デコーダは、与えられた数の入力を与えられた数の出力信号にデコードする組合せ回路である。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

DIGITAL ELECTRONICS NOTESをやってみる (5. ゲート)

以下のデジタル回路の問題をやってみる。続き。

lancamentomerlo.my.canva.site

A B R
0 0 0
0 1 1
1 0 1
1 1 0
  • Q: データ通信におけるXORゲートの典型的な役割は何か?
  • A: XORゲートにより、パリティの検出やCRCECCなどに使われる。また、疑似乱数生成にもXORが使用される。

  • Q: XORゲートを用いてどのように否定論理を設計するか?

  • A: XORゲートでは、片方の入力に1を入力するともう片方の入力が反転する採用があるので、NOT(A) = XOR(A, 1)で実現できる。

  • Q: XORゲートを用いてPassゲートもしくはバッファをどのように設計するか?

  • A: XORゲートでは、片方の入力に0を入力するともう片方の入力がそのまま出てくる作用があるので、BUF(A) = XOR(A, 0)で実現できる。

  • Q: 階段の電球には2つのスイッチがあり、1つのスイッチは1階、もう1つのスイッチは2階にある。もう一方のスイッチの状態に関係なく、どちらかのスイッチで電球を点灯させたり、消灯させたりすることができる。この論理は、電球がONになった場合、どのゲートに似ているか?

  • A: 質問の想定する状態がよく分からんなあ...
S0 S1 ON OFF
0    0   0    1
0    1   1    0 (S0 was off, S1=1 causes bulb to turn on)
1    0   1    0 (S1 was off, S0=1 causes bulb to turn on)
1    1   0    1 (either S0/S1 was on and changing other switch to 1 causes bulb to be off)
  • Q: XORゲートを、最小数のNANDゲートで実装するとどうなる?
  • A: A XOR B = A'B + AB' = 0 + A'B + 0 + AB' = AA' + A'B + AA' + AB' = A(A' + B') + B(A' + B') = A(AB)' + B(AB)' = (A(AB)' + B(AB)')'' = ((A(AB)')'(B(AB)')')'

わけわかんないな。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

RISC-VのPLICのためのテストケースを作って、Spikeとの一致検証環境を構築する

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

PLICの実装で、一致比較環境が完成したのでテストを作って修正している。 まずはレジスタアクセスの部分から。とりあえず波形を見ながら修正している。 いろんなメモリサイズでレジスタアクセスをして修正中。

DIGITAL ELECTRONICS NOTESをやってみる (4. AND / OR 論理)

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

以下のデジタル回路の問題をやってみる。続き。

lancamentomerlo.my.canva.site

  • Q: 次のゲートのうち、ユニバーサルゲートと呼ばれるものはどれか、またその理由は?
    • AND / NAND / OR / NOR / XOR
  • A: ユニバーサルゲートは、他のゲートタイプを使用することなく、任意のブール関数を実装することができるゲートです。NANDゲートとNORゲートはユニバーサルゲートです。

  • Q: 2:1 MUXを使用して、以下のゲートをどのように実装することができますか? Mux(SEL, A, B) = SEL ? B : A

    1. Single Input NOT = Mux(A, 1, 0)
    1. Two Input AND = Mux (B, 0, A)
    1. Two Input OR = Mux (B, A, 1)
    1. Two Input NOR = NOT と ORの組み合わせ
    1. Two Input NAND = NOT と ANDの組み合わせ
    1. Two Input XOR = Mux (B, A, NOT(A))