2010-11-14 15 views
6

Bilgisayar Mimarisi için oluşturduğum bir işlemci için Verilog'da basit bir imza genişletici üzerinde çalışıyorum. İşteVerilog'da bir sayı nasıl imzalanır

Bugüne kadar bu var: [EDIT: Değiştirilen seçim ifadesini hafifçe]

`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 
Ben inanıyorum sorunumu, çözecek süre (CLK == 1) düşünme eklendi

sonsuz bir döngü. Bunu iSim'de test etmeye çalıştığımda, devre asla başlamaz.

Ayrıca kopyalama sözdizimini kaldırmayı ve [8] - [15] için sadece genişletme [8] = uzat [7] vb. Yapmayı denedim, ancak aynı sonuç ortaya çıktı, bu yüzden en içteki sözdiziminin eminim doğru.

İşte sınama dosyası var:

`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 

başarıyla bunu nasıl herhangi bir fikir?

+0

sizin 'begin's ve' end's ... – Marty

cevap

13

Neredeyse got it ...

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

Ayrıca '40' test için bir saat kenarı eksik.

+0

Teşekkür izle, ben ne eksikti gerçekten de! –

10

Biz bir clk içermemelidir böylece modül atama saf birleşimsel olan arada

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

Bazı araçların genişlik uyuşmazlığı hakkında bir uyarı vereceğine dikkat edin, çünkü "$ imzalı (uzatılmamış)", "genişletilmiş" olduğunu varsaymadan önce yalnızca 8 bittir. – minexew

2

uzatmak imzalamak için sözdizimi $signed kullanabilirsiniz & beni ... sen almak nasıl haber verecek bu deneyin Bu Modülünüzü yapmanın başka bir yoludur:

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 

;)