0

私は Verilog が初めてで、2 つのモジュールを定義する Verilg コードに取り組んでいます。最初のモジュールは 2 つの数値の mod を計算し、2 番目のモジュールはその結果を使用して操作を行います。

両方のモジュールで同じ clk が使用されたため、結果は正しくなく、多くの don't care 値が含まれていました。同期のために何か提案をしてください。

モッドモジュール

module mod(m,a,b);
  input  [15:0] a,b;
  output [15:0] m;

  reg [31:0] mod;
  reg [31:0] mul;

  integer i;

  always @* begin
    mul = a*b;
    mod = 32'h80008000;
    for(i=0;i<16;i=i+1) begin
      if(mul > mod) begin
        mul = mul - mod;
        mod = mod >> 1;
      end 
      else begin
        mod = mod >> 1;
      end
    end
    assign m=mul[15:0];
 endmodule 

トップモジュールの一部:

initial begin
  keyp <= 2'b10;
  shift <= 1'b0;
end

 always @(posedge clk) begin
   if(load)
     case (keyp)
       2'b10: begin 
          key[127:64] <= {k1,k0};
          keyp        <= 2'b01;
       end
       2'b01: begin
         key[63:0] <= {k1,k0};
         keyp      <= 2'b00;
         shift     <= 1'b1;
       end
     //default: keyp <=2'b00;
     endcase
   else if (shift) begin
     //shift key for first round
     temp[24:0]    <= key[127:103];
     key[127:25]   <= key[102:0];
     key [24:0]    <= temp [24:0];
     shift         <= 1'b0;
   end
 end

 assign w1[2*SIZE-1:SIZE]   = d1+key[2*SIZE-1:SIZE];
 assign w1[3*SIZE-1:2*SIZE] = d2+key[3*SIZE-1:2*SIZE];

 mod mod1( w1[SIZE-1:0],        d0, key[SIZE-1:0]       );
 mod mod2( w1[4*SIZE-1:3*SIZE], d3, key[4*SIZE-1:3*SIZE]);
4

2 に答える 2

0

x は、casex ステートメントまたは Karnaugh マップで do not care と呼ばれます。ここでは、x は未知の値を表します。不明な値は、初期化されていない値 (リセット) または複数の (競合する) ドライバーから発生する可能性があります。

mod モジュールには、次のコード セクションが含まれています。

always @* begin
  mul = a*b;
  mod = 32'h80008000;
  for(i=0;i<16;i=i+1) begin
    if(mul > mod) begin
      mul = mul - mod;
      mod = mod >> 1;
    end 
    else begin
      mod = mod >> 1;
    end
  end

always @*組み合わせブロックの場合、 mul を複数回割り当てると、最後の割り当てのみが有効になります。

ここで for ループを使用すると、c の場合と同様に、変数を再利用しようとしているように見えます。ハードウェアを説明していることと、値がフリップフロップまたはモジュール間のワイヤとしてどこかに存在することを意図しており、任意のクロック サイクルで 1 つの値しか保持できないことを思い出してください。

それ自体が mul 定義されている組み合わせブロックmul = mul - mod;では、これは機能しません。ループを中断するには、フリップフロップを追加する必要があります。

于 2012-11-15T21:41:02.653 に答える
0

ブロック割り当てを使用して同じ値を複数回割り当てることは、完全に有効な Verilog です。同じ用語が両側に表示されていても問題ありませんが、その前に少なくとも 1 回割り当てられていれば問題ありません。

ここのコードは不完全ですが、コードが複数の場所で「キー」に割り当てられていることが問題のようです。mod インスタンスの出力として、およびクロックされたブロック内の両方として。これら 2 つの値が key の値について「同意しない」場合はいつでも、X と見なされます。X は、不明を表すことに加えて、2 つの異なる割り当てが競合する競合を反映しています。

このコードが何を意味するのかわからないので (ある種の暗号化のようです)、修正を提供することはできませんが、キーへの割り当てを分離する必要があります。

于 2012-11-20T15:26:10.667 に答える