質問
コンピューターアーキテクチャ用に作成しているプロセッサのために、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]の拡張[8] =拡張[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
これをうまくできる方法はありますか?
解決
あなたはほとんどそれを手に入れました...
always @( posedge clk ) begin
extended[15:0] <= { {8{extend[7]}}, extend[7:0] };
end
また、「40」テストのクロックエッジがありません。これを試してみて、あなたがどのように乗るか教えてください...
他のヒント
構文を使用できます $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
ちなみに、モジュールの割り当ては純粋な組み合わせであるため、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
;)
所属していません StackOverflow