0

特定のタイプのビットレベル操作は、インデックスと新しい値を指定して、マルチビット値の 1 つの単一ビットを設定またはクリアすることで構成されます。この操作は、次のインターフェイスを持つ BitSet 回路によってハードウェアに実装できます。

  • 入力 x は、元の値を表す 4 ビット値です。
  • 出力 y は、ビット セット操作後の変更された値を表す 4 ビット値です。
  • 入力インデックスは、0 ~ 3 の範囲の 2 ビット値で、変更するビットのインデックスを示します。
  • 入力値は 0 または 1 に設定された 1 ビット値で、ビット インデックスが出力 y でとるべき値を示します。y の 1 つおきのビットは、x の対応するビットと一致する必要があります。

クラスの例から取ったコードは次のとおりです。

module BitSet(input [3:0]x,
         input [1:0]index,
         input value,
         output [3:0]y);
   always@(x,index,value);
   begin
      if (index = 2'b00) 
        y[0] = value;
     if(index = 2'b01)
        y[1]=value;
     if(index = 2'b10)
        y[2]=value;
     if(index=2'b11)
        y[3]=value;
   end
 endmodule

テストベンチは次のとおりです。

module BitSet_tb();
    reg [3:0]x;
    reg [1:0]index;
    reg value;
    wire [3:0]y;

    BitSet uut(
      .x(x),
      .index(index),
      .value(value),
      .y(y)
    );

    initial begin
        $monitor ("%d %b %b %b %b", $time, x, index, value, y);
           x=4'b0000;
           index=2'b00;
           value=1'b0;
       #10 x=4'b0001;
           index=2'b01;
           value=1'b0;
       #10 x=4'b1111;
           index=2'b10;
           value=1'b0;
       #10 x=4'b1111;
           index=2'b11;
           value=1'b0;
       #10 $finish;
     end
 endmodule

コンパイル時に、次のエラーが発生します。

bitset.v:10: syntax error
bitset.v:12: error: invalid module item.
bitset.v:13: syntax error
bitset.v:14: error: invalid module item.
bitset.v:15: syntax error
bitset.v:16: error: invalid module item.
bitset.v:17: syntax error
bitset.v:18: error: invalid module item.
bitset.v:19: syntax error

これが私が望むことをするかどうかさえわかりませんが、誰かがエラーを手伝ったり、プログラムを修正して要求されたことを実行する方法を教えてくれますか?

4

1 に答える 1

1

いいえ、構文エラーが修正されたとしても、これはあなたが望むことにはなりません。構文エラーの解決をお手伝いし、問題を解決するための正しい道筋を示すようにします (SO では、ハードウェアの問題を完全に解決することは想定されていないと思います!)

module BitSet(input  [3:0] x,
              input  [1:0] index,
              input        value,
              output reg [3:0] y); // y needs to be of type reg if you're
                                   // going to use it in a procedural block
                                   // (like an always block)

   // The * infers the sensitivity list, no need to list out each signal.
   // Also, you can't have a semicolon here.
   always@(*) 
   begin
     // Like in C, a single "=" is an assignment, while a compare is "==".
     // You want to compare index to 2'b00, not assign it that value, 
     if (index == 2'b00) 
        y[0] = value;
     if (index == 2'b01)
        y[1] = value;
     if (index == 2'b10)
        y[2] = value;
     if (index == 2'b11)
        y[3] = value;
   end
 endmodule

さて、正しい機能を得るために...あなたはほとんどそこにいます.実際には1行追加するだけで実行できます. あなたへの私の質問はこれです:あなたのコードでは、xの直接値を取り、変更されないはずのyのビットはどうなりますか? あなたのコードはこれを正確に処理していますか? そうでない場合、これを処理するために何をする必要がありますか?

念のため、SystemVerilog 構文が更新されたバージョンを次に示します。

module BitSet(input  [3:0] x,
              input  [1:0] index,
              input        value,
              output logic [3:0] y); // "logic" type can be used as a wire or reg

   // Just like always @(*), but directly indicates that this
   // is combinational logic. Tools will throw an error if you
   // accidentally encode a latch (which you have done!)
   always_comb 
   begin
     if (index == 2'b00)
        y[0] = value;
     if (index == 2'b01)
        y[1] = value;
     if (index == 2'b10)
        y[2] = value;
     if (index == 2'b11)
        y[3] = value;
   end
endmodule
于 2016-02-04T05:24:25.693 に答える