-1

このプログラムを Verilog で作成しましたが、シミュレートしようとすると、出力変数と入力変数の両方で XXXX... しか表示されません。自分が何を間違えたのかわからない…

PS。シミュレーションファイルでは、たとえば値を指定しますin = 16'b1101100100001111; #20;

module hamming_decoder(
output reg [10:0] out,
output reg [3:0] error_index,
output reg error,
output reg uncorrectable,
input [16:1] in
);

reg y; // in case "single error", gives the position of the error bit    
reg [1:0] check; // if check[0] = 0 - no error
              // if check[0] = 1 and check[1] = 0 => double error
              // if check[0] = 1 and check[1] = 1 => single error


assign error_index[0] = in[16] ^ in[14] ^ in[12] ^ in[10] ^ in[8] ^ in[6] ^ in[4] ^ in[2];
assign error_index[1] = in[15] ^ in[14] ^ in[11] ^ in[10] ^ in[7] ^ in[6] ^ in[3] ^ in[2];
assign error_index[2] = in[13] ^ in[12] ^ in[11] ^ in[10] ^ in[5] ^ in[4] ^ in[3] ^ in[2];
assign error_index[3] = in[9] ^ in[8] ^ in[7] ^ in[6] ^ in[5] ^ in[4] ^ in[3] ^ in[2];

assign check[1] = in[1] ^ in[2] ^ in[3] ^ in[4] ^ in[5] ^ in[6] ^ in[7] ^ in[8] ^ in[9] ^ in[10] ^ in[11] ^ in[12] ^ in[13] ^ in[14] ^ in[15] ^ in[16]; 

always @(*)
begin
if (error_index[0] != 0 || error_index[1] != 0 || error_index[2] != 0 || error_index[3] != 0)
    begin
        check[0] = 1;
        error = 1;
    end

if (check[0] == 0)
    begin
        error = 0;
        uncorrectable = 0;
        out[0] = in[1];
        out[1] = in[2];
        out[2] = in[3];
        out[3] = in[4];
        out[4] = in[5];
        out[5] = in[6];
        out[6] = in[7];
        out[7] = in[9];
        out[8] = in[10];
        out[9] = in[11];
        out[10] = in[13];
    end
        else if(check[1] == 0)
                begin
                    error = 1;
                    uncorrectable = 1;
                    out[0] = in[3];
                    out[1] = in[5];
                    out[2] = in[6];
                    out[3] = in[7];
                    out[4] = in[9];
                    out[5] = in[10];
                    out[6] = in[11];
                    out[7] = in[12];
                    out[8] = in[13];
                    out[9] = in[14];
                    out[10] = in[15];
                end
            else if (check[1] == 1 && check[0] != 0)
                        begin
                            error = 1;
                            uncorrectable = 0;
                            y = error_index[0] + error_index[1] * 2 + error_index[2] * 4 + error_index[3] * 8;
                            out[0] = in[3];
                            out[1] = in[5];
                            out[2] = in[6];
                            out[3] = in[7];
                            out[4] = in[9];
                            out[5] = in[10];
                            out[6] = in[11];
                            out[7] = in[12];
                            out[8] = in[13];
                            out[9] = in[14];
                            out[10] = in[15];
                            out[y-1] = !out[y-1]; // ?
                        end
end

endmodule
4

1 に答える 1

1

これは、テストベンチ ポート接続に関連する問題である可能性があります。テスト ベンチのインスタンス化に自信がありますか?

また、適切な入力を提供するには、周期的な入力用のクロック信号が必要です。そうしないと、すべての入力がシミュレーション時間ゼロでデザイン内を移動します。

このサンプル16'b1101100100001111は、単一のエラー入力データとして表示されます。テストベンチも見せていただけると助かります。

コードをシミュレートし、テストベンチを提供しました。ロジックの部分は残して、デザインはうまくいっているようです。テストベンチはこちらから入手できます。

編集:

はい、あなたの設計は組み合わせ回路です。入力から出力への変換は、シミュレーション時間ゼロで発生します。そのため、 100ns でinが発生するとすぐにoutの値が計算され、テストは突然終了します。in = 020ns の遅延とビオラを追加するだけです..!!

上記の EDAPlayground リンクにテストを追加しました。上記の変更を追加しただけです。テスト ベンチ コーディングの基本に関するこのPDFが役立つ場合があります。

于 2015-11-04T12:31:06.183 に答える