2010-11-14 25 views
6

Je travaille sur un simple sign-extendeur dans Verilog pour un processeur que je crée pour Computer Architecture.Comment signer-prolonger un numéro dans Verilog

Voici ce que j'ai à ce jour: [EDIT: Modification de la déclaration de sélection légèrement]

`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 

J'ai ajouté la pensée while (CLK == 1) qui résoudrait mon problème, que je crois une boucle infinie. Lorsque j'essaie de tester cela dans iSim, le circuit ne s'initialise jamais. J'ai également essayé de supprimer la syntaxe de copie et de faire simplement extended [8] = extend [7] etc. pour [8] - [15], mais le même résultat se produit, donc je suis à peu près sûr que la syntaxe la plus interne est correct.

Voici le fichier de test:

`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 

Toute idée comment je peux le faire avec succès?

+0

Regardez vos '' begin's et end's ... – Marty

Répondre

13

Vous l'avez presque ...

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

vous manquez aussi une horloge de bord pour le test '40'. Essayez ceci, & laissez-moi savoir comment vous allez ...

+0

Merci, c'est bien ce que je manque! –

10

Nous pouvons utiliser la syntaxe $signed pour signer étendre

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

[email protected](posedge clk) 
    begin 
    extended <= $signed(unextended); 
    end 
endmodule 
+1

Notez que certains outils vont déclencher un avertissement à propos de la non-concordance de largeur, car '$ signed (unxtended)' est toujours juste 8 bits avant qu'il ne soit assigné à 'extended' – minexew

2

Par la façon dont votre assign module est pur combinatoires donc il ne doit pas contenir clk , ceci est une autre façon de faire votre module:

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 

;)