MacでVerilogのシミュレーションをしてみる5

MacでVerilogのシミュレーションをしてみる1 - k-igrsの日記

MacでVerilogのシミュレーションをしてみる2 - k-igrsの日記

MacでVerilogのシミュレーションをしてみる3 - k-igrsの日記

MacでVerilogのシミュレーションをしてみる4 - k-igrsの日記

の続き。

レジスタに直値を代入する命令を追加する。

parameter OP_MOV_IM = 8'h03;
 オペランドの指定により、命令の次のリードデータについて、

B6 B5
0  0    メモリからR0に読み込み
0  1    メモリからR1に読み込み
1  0    メモリからR2に読み込み
1  1    メモリからR3に読み込み

 を行う。

Fetch → Decode → 次のメモリからレジスタに格納するデータを読み込む →レジスタにリードしたデータを書いてFetchに戻る処理を追加する。

f:id:k_igrs:20210705193238j:plain

MOVE IMM命令への分岐を記述する。

assign path_movim = (op_code == OP_MOV_IM ) ? 3'b011 : 3'b000;

assign state_sel = path_jump | path_movrm | path_movim;

 ステートマシンにMOVE IMM命令のパスを追加する。

        case ( state )
            4'b0000:begin
                Q <= 4'b0001;
            end
            4'b0001:begin
                if ( STATE_SEL == 3'b000 )
                    Q <= 4'b0010;
                else if ( STATE_SEL == 3'b001 ) begin
                    Q <= 4'b0011;
                    PC <= PC + 1;
                end
                else if ( STATE_SEL == 3'b010 ) begin
                    Q <= 4'b0101;
                    PC <= PC + 1;
                end
                else if ( STATE_SEL == 3'b011 ) begin
                    Q <= 4'b1000;
                    PC <= PC + 1;
                end
            end
〜略〜
            4'b1000: begin
                Q <= 4'b1001;
            end
            4'b1001: begin
                Q <= 4'b0000;
                PC <= PC + 1;
            end

RDBはステート1000bとFetchに戻った時アクティブにする。

assign pre_rdb =
〜略〜
    ((Q == 4'b0001) && (op_code == OP_MOV_IM)) ? 1'b0 :
    ( Q == 4'b1001)                            ? 1'b0 : 1'b1;

 内部レジスタへ直値のメモリデータを読み込む処理を記述する。

always @( posedge CK, negedge RB )
    if ( RB == 1'b0 ) begin
            R0 <= 16'h0000;
            R1 <= 16'h0000;
            R2 <= 16'h0000;
            R3 <= 16'h0000;
    end
    else
        if (((Q == 4'b0110)||(Q == 4'b1000)) && (RDB == 1'b0) ) begin
            case ( op_rand[6:5] )
                2'b00: R0 <= DI;
                2'b01: R1 <= DI;
                2'b10: R2 <= DI;
                2'b11: R3 <= DI;
            endcase
        end

レジスタに直値を代入するプログラムを書いてシミュレーションを実行して確認する。 

0000
0001
0300 <- R0に0123hを読み込む
0123
0320 <- R1に4567hを読み込む
4567
0340  <- R2に89abhを読み込む
89ab
0360  <- R3にcdefhを読み込む
cdef
0012
0013

 実行結果

f:id:k_igrs:20210705195616p:plain