なにもわからないログ

人生わからないことだらけ

ハードウェアシミュレータのハマりどころ【コンピュータシステムの理論と実装】

概要

www.oreilly.co.jp 課題を実装するにあたって、本質的じゃない部分(ハードウェアシミュレータの使い方)でハマることがあったのでメモ。

バス

ピンで多ビットを表現する場合は以下のように記述する。

CHIP Test {
     IN  
         in[16]; // 0000 0000 0000 0011
     
     PARTS:
         // 配列のような記法で多ビットの一部を入力に指定できる。この例の場合 a=1, b=1 になる
         Or(a=in[0], b=in[1], out=a);
     
         // 範囲指定も可能
         Or8Way(in=in[0..7], out=b);
     
         // 出力も範囲指定できる。こうすることで、16ビットの出力を8ビット×2の出力に分割することが可能
         Or16(a=in, b=in, out[0..7]=c, out[8..15]=d);
}

ハードウェアシミュレータ上での多ビットの入力値の指定方法

2進数では指定できないので、10進数に変換した数値を指定する。

0000 1111を入力したい場合の例 

また、値は補数表現として解釈される。 例えば、1111 1111 1111 1111を入力したい場合は 65535 ではなく -1 を指定する。

その他のルール

出力ピンは入力に指定できない

以下のようなことをしようとするとエラーになる。

CHIP Test {
    IN  
        in[16];
    OUT
        out1, out2;
    
    PARTS:
        Or(a=true, b=true, out=out1);
        Or(a=out1, b=false, out=out2);
}

同じことをしたい場合、複数のピンに同じ値を出力すればよい。

CHIP Test {
    IN  
        in[16];
    OUT
        out1, out2;
    
    PARTS:
        Or(a=true, b=false, out=out1, out=iout);
        Or(a=iout, b=false, out=out2);
}

内部ピンのバスは参照できない

以下のようなことをしようとするとエラーになる。

CHIP Test {
    IN  
        in[16];
    OUT
        out;
    PARTS:
        Or16(a=in, b=in, out=a);
        Or(a=a[0], b=a[1], out=out);
}

使いたい桁数にあらかじめ分割しておけばOK。

CHIP Test {
    IN  
        in[16];
    OUT
        out;
    PARTS:
        Or16(a=in, b=in, out[0]=a, out[1]=b);
        Or(a=a, b=b, out=out);
}