Pregunta

Estoy trabajando en un simple inicio de sesión para aumentar el volumen de Verilog para un procesador que estoy creando para la Arquitectura de Computadores.

Esto es lo que tengo hasta ahora: [EDIT: Se ha cambiado la declaración de selección poco]

`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

He añadido el tiempo (== 1 CLK) pensar que solucionaría mi problema, que creo que es un bucle infinito. Cuando trato de probar esto en ISIM, el circuito nunca se inicializa.

También intentó eliminar la sintaxis copiando y sólo haciendo extendió [8] = extender [7], etc., para [8] - [15], pero el mismo resultado se produce, así que estoy bastante seguro de que la sintaxis es más interno correcta.

Aquí está el archivo de prueba:

`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

¿Alguna idea de cómo puedo hacer esto con éxito?

¿Fue útil?

Solución

casi lo consiguió ...

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

También se está perdiendo un flanco de reloj para la prueba '40'. Prueba de esto, y me dejó sabe cómo le va ...

Otros consejos

Podemos utilizar la sintaxis $signed a firmar extender

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

Por cierto su Asignar módulo es pura combinatoria lo que no debería contener un CLK, esta es otra forma de hacer su módulo:

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

;)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top