Ik werk aan een eenvoudige sign-extender in Verilog voor een processor die ik maak voor computerarchitectuur.
Hier is wat ik tot nu toe heb gekregen: [EDIT: de selectieluidement enigszins]
`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
Ik heb de while toegevoegd (CLK == 1) denken die mijn probleem zou oplossen, wat ik geloof dat ik een oneindige lus is. Wanneer ik dit in Isim probeer te testen, initialiseert het circuit nooit.
Ik heb ook geprobeerd de kopiërende syntaxis te verwijderen en gewoon uitgebreid [8] = uit te breiden [7] enz. Voor [8] – [15], maar hetzelfde resultaat treedt op, dus ik ben er vrij zeker van dat de binnenste syntaxis is correct.
Hier is het testbestand:
`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
Alle ideeën hoe ik dit met succes kan doen?
Antwoord 1, Autoriteit 100%
je hebt het bijna …
always @( posedge clk ) begin
extended[15:0] <= { {8{extend[7]}}, extend[7:0] };
end
Je mist ook een klokrand voor de ’40’-test. Probeer dit, & laat me weten hoe het je vergaat…
Antwoord 2, autoriteit 62%
We kunnen de syntaxis $signed
gebruiken om verlengen te ondertekenen
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
Antwoord 3, autoriteit 14%
Trouwens, je moduletoewijzing is puur combinatorisch, dus het mag geen clk bevatten, dit is een andere manier om je module te doen:
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
;)