Hoe u een nummer in Verilog

Ik werk aan een eenvoudige sign-extender in Verilog voor een processor die ik maak voor computerarchitectuur.

Hier is wat ik tot nu toe heb gekregen: [EDIT: de selectieluidement enigszins]

`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

Ik heb de while toegevoegd (CLK == 1) denken die mijn probleem zou oplossen, wat ik geloof dat ik een oneindige lus is. Wanneer ik dit in Isim probeer te testen, initialiseert het circuit nooit.

Ik heb ook geprobeerd de kopiërende syntaxis te verwijderen en gewoon uitgebreid [8] = uit te breiden [7] enz. Voor [8] – [15], maar hetzelfde resultaat treedt op, dus ik ben er vrij zeker van dat de binnenste syntaxis is correct.

Hier is het testbestand:

`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

Alle ideeën hoe ik dit met succes kan doen?


Antwoord 1, Autoriteit 100%

je hebt het bijna …

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

Je mist ook een klokrand voor de ’40’-test. Probeer dit, & laat me weten hoe het je vergaat…


Antwoord 2, autoriteit 62%

We kunnen de syntaxis $signedgebruiken om verlengen te ondertekenen

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

Antwoord 3, autoriteit 14%

Trouwens, je moduletoewijzing is puur combinatorisch, dus het mag geen clk bevatten, dit is een andere manier om je module te doen:

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
;)

Other episodes