1

Verilog で加算器を設計しています。サイズ N の 2 つの入力と 2 つの出力があります。最初の出力のサイズは 2N で、2 番目の出力のサイズは K です。

これは私がこれまでに持っているものです:

module adder(
  out,
  CCR,
  inA,
  inB
);
parameter N=8,CCR_size=8;
parameter M=2*N;
input  [N-1:0]        inA,inB;
output [M-1:0]        out;
output [CCR_size-1:0] CCR;
reg    [N:0]          temp;
always @(inA or inB)
  begin
    temp      = inA+inB;
    CCR[0]    = temp[N];
    out[N-1:0]= temp[N-1:0];
    out[M-1:N]= 'b0;
  end
endmodule

コメントから移動: ただし、これはコンパイルされませんでした。行にエラーがあります

CCR[0],out[N-1:0] and out[M-1:N]

# Error: VCP2858 adder.v : (16, 20): CCR[0] is not a valid left-hand side of a procedural assignment.
# Error: VCP2858 adder.v : (17, 28): out[N-1:0] is not a valid left-hand side of a procedural assignment.
# Error: VCP2858 adder.v : (18, 20): out[M-1:N] is not a valid left-hand side of a procedural assignment.

上記のコードの何が問題になっていますか?

4

2 に答える 2

7

レジスタデータ型は、手続き型ブロックの変数として使用されます。信号が手続き型割り当ての左側にある場合は、レジスタデータ型を使用する必要があります。デフォルトのタイプのポートであるwireため、エラーが発生します。出力ポートをタイプに変更regすると、問題が解決するはずです。

output reg[M-1:0] out;
output reg[CCR_size-1:0] CCR;
于 2012-10-07T14:06:26.250 に答える
1

出力をregタイプとして宣言する@damageからの回答を含めて、CCRを8ビット幅として定義し、LSBのみを割り当てます。

Adder からのビットの増加は、最大の入力に対して 1 ビットです。

私は次のように実装します:

module adder(
  parameter N       =8,
  parameter CCR_size=8
)(
  input      [N-1:0]        inA,
  input      [N-1:0]        inB,
  output     [2*N-1:0]      out,
  output reg [CCR_size-1:0] CCR,
);
reg [n:0] sum;

always @* begin
  {CCR, sum}      = inA + inB;
end

assign out = sum; //Will Zero pad

endmodule
于 2012-10-09T18:28:09.597 に答える