12

私は、コンピューター アーキテクチャ用に作成しているプロセッサ用に、Verilog で単純な符号拡張に取り組んでいます。

これが私がこれまでに得たものです:[編集:選択ステートメントを少し変更しました]

`timescale 1ns / 1ps

module SignExtender( CLK, extend, extended );
input[7:0] extend;
input CLK;
output[15:0] extended;

reg[15:0] extended;
wire[7:0] extend;

always
begin
    while (CLK == 1)
    extended[7:0] = extend[7:0];
    extended[15:8] = {8{extend[7]}};
end
endmodule

while (CLK == 1) を追加すると、無限ループであると思われる問題が解決すると考えられます。これを iSim でテストしようとすると、回路が初期化されません。

また、[8]~[15]についてはコピー構文を外してextended[8]=extend[7]などをやってみましたが、同じ結果になるので一番奥の構文が正しいと確信しています。

テストファイルは次のとおりです。

`timescale 1ns / 1ps
module SignExtender_testbench0;

    // Inputs
    reg [7:0] extend;
    reg CLK;

    // Outputs
    wire [15:0] extended;

    // Instantiate the Unit Under Test (UUT)
    SignExtender uut (
        .extend(extend), 
        .extended(extended)
    );

    initial begin
        // Initialize Inputs
        extend = 0;

        #100; // Wait 100 ns for global reset to finish

        extend = -30;
        CLK = 1;
        #10;
        CLK = 0;
        if (extended == -30)
            $display("okay 1");
        else
            $display("fail 1");

        extend = 40;
        #10;
        if (extended == 40)
            $display("okay 2");
        else
            $display("fail 2");

    end

endmodule

これを成功させる方法はありますか?

4

3 に答える 3

23

あなたはほとんどそれを手に入れました...

always @( posedge clk ) begin
    extended[15:0] <= { {8{extend[7]}}, extend[7:0] };
end

「40」テストのクロック エッジも欠落しています。これを試してみて、どうやってうまくいくか教えてください...

于 2010-11-14T07:23:24.167 に答える
13

$signed拡張に署名する構文を使用できます

module signextender(
  input [7:0] unextended,//the msb bit is the sign bit
  input clk,
  output reg [15:0] extended 
);

always@(posedge clk)
  begin 
    extended <= $signed(unextended);
  end
endmodule
于 2012-07-20T14:25:35.290 に答える
3

ちなみに、モジュールの割り当ては純粋な組み合わせであるため、clk を含めることはできません。これは、モジュールを実行する別の方法です。

module sign_ext
             (
              unextend,
              extended
             );

input  [15:0] unextend;
output [31:0] extended;

assign extended = {{16{unextend[15]}}, unextend};

endmodule

//TB

module tb_sign_ext;

reg  [15:0] unex;
wire   [31:0] ext;

sign_ext TBSIGNEXT
                  (
                   .unextend(unex),
                   .extended(ext)
                  );

initial
begin
   unex = 16'd0;
end


initial 
begin
   #10 unex = 16'b0000_0000_1111_1111;
   #20 unex = 16'b1000_0000_1111_1111;
end

endmodule

;)
于 2014-08-08T17:45:39.490 に答える