Project

General

Profile

`timescale 1ns / 1ps
// ============================================================================
// __
// \\__/ o\ (C) 2014 Robert Finch, Stratford
// \ __ / All rights reserved.
// \/_// robfinch<remove>@finitron.ca
// ||
//
// FT816Float_tb.v
// - Test Bench for triple precision floating point accelerator
//
// This source file is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This source file is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// ============================================================================
//
module FT816Float_tb();

reg clk;
reg rst;
reg vda;
reg rw;
reg [23:0] ad;
wire [7:0] db;
reg [7:0] dbo;
wire rdy;
reg [7:0] state;
reg [7:0] retstate;
reg fix2flt;
reg [95:0] value;

initial begin
#1 clk <= 1'b0;
#5 rst <= 1'b1;
#100 rst <= 1'b0;
end

always #5 clk <= ~clk;

assign db = rw ? {8{1'bz}} : dbo;

FT816Float u1 (
.rst(rst),
.clk(clk),
.vda(vda),
.rw(rw),
.ad(ad),
.db(db),
.rdy(rdy)
);


always @(posedge clk)
if (rst)
state <= 8'h00;
else begin
state <= state + 8'd1;
case(state)
8'h00: begin
value <= 96'h00000000000000004D20000; // MAXINT
fix2flt <= 1'b1;
state <= 8'h80;
retstate <= 8'h01;
b_write(24'hFEA20F,8'd17); // prime bus
end
8'h01: if (rdy) b_write(24'hFEA20F,8'd17); else state <= state;// SWAP
8'h03: if (rdy) b_read(24'hFEA20F); else state <= state;
8'h04: if (rdy) begin
if (db[7]) state <= state - 1;
end
else
state <= state;
8'h05: begin
value <= 96'h000000000000000004D20000; // MAXINT
fix2flt <= 1'b1;
state <= 8'h80;
retstate <= 8'h06;
end
8'h06: if (rdy) b_write(24'hFEA20F,8'h06); else state <= state;// MUL
8'h08: if (rdy) b_read(24'hFEA20F); else state <= state;
8'h09: if (rdy) begin
if (db[7]) state <= state - 1;
end
else
state <= state;
8'h20: state <= state;
// This subroutine writes a value to FAC1.
8'h80: if (rdy) b_write(24'hFEA200,value[7:0]); else state <= state;
8'h81: if (rdy) b_write(24'hFEA201,value[15:8]); else state <= state;
8'h82: if (rdy) b_write(24'hFEA202,value[23:16]); else state <= state;
8'h83: if (rdy) b_write(24'hFEA203,value[31:24]); else state <= state;
8'h84: if (rdy) b_write(24'hFEA204,value[39:32]); else state <= state;
8'h85: if (rdy) b_write(24'hFEA205,value[47:40]); else state <= state;
8'h86: if (rdy) b_write(24'hFEA206,value[55:48]); else state <= state;
8'h87: if (rdy) b_write(24'hFEA207,value[63:56]); else state <= state;
8'h88: if (rdy) b_write(24'hFEA208,value[71:64]); else state <= state;
8'h89: if (rdy) b_write(24'hFEA209,value[79:72]); else state <= state;
8'h8A: if (rdy) b_write(24'hFEA20A,value[87:80]); else state <= state;
8'h8B: if (rdy) begin b_write(24'hFEA20B,value[95:88]); if (fix2flt) state <= 8'h90; else state <= retstate; end else state <= state;
8'h90: if (rdy) b_write(24'hFEA20F,8'h05); else state <= state;// FIX2FLT
8'h92: if (rdy) b_read(24'hFEA20F); else state <= state;
8'h93: if (rdy) begin
if (db[7]) state <= state - 1;
else state <= retstate;
end
else
state <= state;
endcase
end

task b_write;
input [23:0] adr;
input [7:0] dat;
begin
vda <= 1'b1;
rw <= 1'b0;
ad <= adr;
dbo <= dat;
end
endtask

task b_read;
input [23:0] adr;
begin
vda <= 1'b1;
rw <= 1'b1;
ad <= adr;
end
endtask

endmodule
(5-5/48)