如何在Verilog中签名扩展一个数字

Ale*_*ans 8 verilog vlsi

我正在为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
Run Code Online (Sandbox Code Playgroud)

我添加了while(CLK == 1)思考可以解决我的问题,我认为这是一个无限循环.当我尝试在iSim中测试时,电路永远不会初始化.

我也尝试删除复制语法,只为[8] - [15]做扩展[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
Run Code Online (Sandbox Code Playgroud)

有什么想法我怎么能成功地做到这一点?

Mar*_*rty 16

你几乎得到了......

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

你也错过了'40'测试的时钟优势.试试这个,让我知道你是怎么做的......


小智 12

我们可以使用语法$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
Run Code Online (Sandbox Code Playgroud)