2010-11-14 5 views
6

Я работаю над простым расширителем знака в Verilog для процессора, который я создаю для компьютерной архитектуры.Как подписать расширение в Verilog

Вот что у меня до сих пор: [EDIT: Изменены оператор выбора немного]

`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 (== 1 CLK), думая, что бы решить мою проблему, которую я считаю, это бесконечный цикл. Когда я пытаюсь проверить это в iSim, схема никогда не инициализируется.

Я также попытался удалить синтаксис копирования и просто выполнить расширенный [8] = extend [7] и т. Д. Для [8] - [15], но тот же результат возникает, поэтому я уверен, что самый внутренний синтаксис верно.

Вот тестовый файл:

`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 

Любые идеи, как я могу сделать это успешно?

+0

Смотрите ваши '' begin's и end's ... – Marty

ответ

13

Вы почти получил его ...

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

Вы также отсутствует тактовую край для испытания на «40». Попробуйте это, & дайте мне знать, как вы получите на ...

+0

Спасибо, это действительно то, что мне не хватало! –

10

Мы можем использовать синтаксис $signed подписать продлить

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

Обратите внимание, что некоторые инструменты вызовут предупреждение о несоответствии ширины, потому что '$ signed (unextended)' все равно всего 8 бит, прежде чем оно будет воспринято 'extended' – minexew

2

Кстати ваш модуль правопреемник чисто комбинационный поэтому оно не должно содержать 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 

;)