Cómo inscribirse extender un número en Verilog
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?
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
;)