3

Verilog では、過去に取得できないエラーがあります。これはコードの最初のビットであり、最後のビットです

 module Decoder(op,funct,aluop,mwr,mreg,mrd,alusrc,regdst,regwr,btype);
  input[5:0] op,funct;
  output[2:0] aluop;
  output[1:0] btype;
  output mwr,mreg,mrd,alusrc,regdst,regwr;
  wire aluop,mwr,mreg,mrd,alusrc,regdst,regwr,btype;
  case(op)
      6'b000000: begin
          case(funct)
              6'b001010:
                  assign aluop = 3'b010;
              6'b001100:
                  assign aluop = 3'b111;
              6'b010001:
                  assign aluop = 3'b011;
              default:
                  assign aluop = 3'b000;          
          endcase
          assign btype = 2'b00;
          assign mwr = 1'b0;
          assign mreg = 1'b0;
          assign mrd = 1'b0;
          assign alusrc = 1'b0;
          assign regdst = 1'b1;
          assign regwr = 1'b1;
          end

...

  default: begin
      assign aluop = 3'b000;
        assign mwr = 0;
        assign mreg = 0;
        assign mrd = 0;
        assign alusrc = 0;
        assign btype = 2'b00;
        assign regdst = 0;
        assign regwr = 0;
        end
endcase

エンドモジュール

それは私に次のエラーを与え続けます

Error (10170): Verilog HDL syntax error at Decoder.v(7) near text "case"; expecting "endmodule" Error (10170): Verilog HDL syntax error at Decoder.v(14) near text "6"; expecting "endmodule"

It also does this at every end statement and default and endcase

I have no idea why it's doing this, I'm fairly new to verilog.

thanks in advance

4

2 に答える 2

6

caseステートメントまたはブロックif/else内でのみ使用できると思います。alwaysあなたのエラーメッセージがもう少し役立つことを言っていない理由はわかりませんが、それが問題である可能性があります.

次のようにコードを書き直してみてください。

//change wire types to reg type

always @*
begin
  case (op)
    6'b000000: begin
      aluop = 3'b000
    end
    ...
  endcase
end
于 2012-05-04T07:25:46.257 に答える
2

これは推測ですが、コンパイラは IEEE 1364-2001 verilog を想定している可能性が高く、コードがこのバージョンの言語に対して有効でないため、エラーを出しています。いずれにせよ、Tim のコードはおそらくあなたが探している機能です。

なぜ有効でないのかというと、Verilog には基本的にすべてのモジュール宣言内に 2 つの「コンテキスト」が含まれています。モジュールに直接現れるものはすべてモジュール項目です。これらには、reg/wire 宣言、assign ステートメント、always ステートメント、生成構造、およびモジュール インスタンスが含まれます。

module mod;

reg reg1;           //Module item
wire wire1;         //Module item
assign wire1 = 0;   //Module item
always reg1 = 0;    //Module item
parameter con1 = 0; //Module item
 //Instances a different module based on con1
case(con1)          //Module item
  0:mod2 inst1(reg1);
  1:mod3 inst1(reg1);
  2:mod4 inst1(reg1);
endcase

endmodule

第 2 に、手続き型ステートメントが存在する可能性がある手続き型コンテキストがあります。これは、タスク宣言、関数宣言、always ブロック、初期ブロック、およびその他のいくつかの領域内の任意のコードです。

module mod2;
reg a;

always
  begin
  a = 0; //Procedural statement
  end

initial
   a = 0; //Procedural statement 

function func1(input arg1);
case (arg1) //Procedural statement 
  0:func1 = 0; 
  default:func1 = 9;
endcase
endfunction

endmodule

2001 年以降、Verilog には 2 種類のケース ステートメント、手続き型ケース ステートメントと生成ケース ステートメントが含まれています。手続き型のケース ステートメントは、手続き型言語と同じように機能しますが、手続き型のコンテキストで表示する必要があります。Generate case ステートメントは、シミュレーションの開始前に静的に評価され、モジュール宣言コンテキストでモジュール項目としてのみ表示される場合があります。2 番目のコンテキストでは、case 式が定数である必要があることに注意してください。

Verilog の最新バージョンである 1364-2005 では、生成ケースがモジュール スコープに直接表示される場合がありますが、言語の 2001 バージョンでは、すべての生成アイテムをgenerate..endgenerateキーワードで囲む必要があります。コンパイラが IEEE 1364-2001 を想定している場合、表示されるエラー メッセージは理にかなっています。

于 2012-05-04T13:38:36.897 に答える