gw: Import the gateware (RTL & Sim)
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>master
parent
c3485e9119
commit
18adc3602a
|
@ -0,0 +1,23 @@
|
|||
#
|
||||
# Simulation Makefile
|
||||
#
|
||||
|
||||
XILINX_LIBS=\
|
||||
xilinx/glbl.v \
|
||||
xilinx/DSP48E1.v \
|
||||
xilinx/RAMB36E1.v
|
||||
|
||||
OBJS=\
|
||||
sig_combine.v \
|
||||
sig_delay.v
|
||||
|
||||
TESTBENCHES=\
|
||||
sig_chain_tb
|
||||
|
||||
all: $(TESTBENCHES)
|
||||
|
||||
%_tb: %_tb.v $(XILINX_LIBS) $(OBJS)
|
||||
iverilog -Wall -DSIM=1 -o $@ $(XILINX_LIBS) $(OBJS) $<
|
||||
|
||||
clean:
|
||||
rm -f $(TESTBENCHES) *.vcd
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* sig_chain_tb.v
|
||||
*
|
||||
* Copyright (C) 2018 sysmocom - systems for mobile communications GmbH
|
||||
*
|
||||
* vim: ts=4 sw=4
|
||||
*/
|
||||
|
||||
`default_nettype none
|
||||
`timescale 1ns/1ps
|
||||
|
||||
module sig_chain_tb;
|
||||
|
||||
// Signals
|
||||
reg rst = 1;
|
||||
reg clk = 0;
|
||||
|
||||
reg data_valid;
|
||||
reg [11:0] data_in;
|
||||
wire [11:0] data_out;
|
||||
wire [11:0] data_comb_3;
|
||||
wire [14:0] cfg_delay;
|
||||
|
||||
// Setup recording
|
||||
initial begin
|
||||
$dumpfile("sig_chain_tb.vcd");
|
||||
$dumpvars(0,sig_chain_tb);
|
||||
end
|
||||
|
||||
// Reset pulse
|
||||
initial begin
|
||||
# 21 rst = 0;
|
||||
# 50000 $finish;
|
||||
end
|
||||
|
||||
// Clock
|
||||
always #5 clk = !clk;
|
||||
|
||||
// DUT
|
||||
sig_delay #(
|
||||
.WIDTH(12)
|
||||
) dut_A_I (
|
||||
.data_valid(data_valid),
|
||||
.data_in(data_in),
|
||||
.data_out(data_out),
|
||||
.delay(cfg_delay),
|
||||
.clk(clk),
|
||||
.rst(rst)
|
||||
);
|
||||
|
||||
sig_combine #(
|
||||
.D_WIDTH(12),
|
||||
.S_WIDTH(16),
|
||||
.S_FRAC(14)
|
||||
) dut_B_I (
|
||||
.in_data_0(data_out),
|
||||
.in_scale_0(16'h2000), // 0.5
|
||||
.in_chain_0(data_in),
|
||||
.out_3(data_comb_3),
|
||||
.clk(clk),
|
||||
.rst(rst)
|
||||
);
|
||||
|
||||
// Data gen
|
||||
always @(posedge clk)
|
||||
if (rst)
|
||||
data_in <= 0;
|
||||
else if (data_valid)
|
||||
data_in <= data_in + 1;
|
||||
|
||||
always @(posedge clk)
|
||||
if (rst)
|
||||
data_valid <= 1'b0;
|
||||
else
|
||||
data_valid <= ($random & 3) == 0;
|
||||
|
||||
// Config
|
||||
assign cfg_delay = 14'h00;
|
||||
|
||||
endmodule // sig_chain_tb
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
* sig_combine.v
|
||||
*
|
||||
* Simple signal combiner using DSP48E
|
||||
*
|
||||
* Copyright (C) 2018 sysmocom - systems for mobile communications GmbH
|
||||
*
|
||||
* vim: ts=4 sw=4
|
||||
*/
|
||||
|
||||
`ifdef SIM
|
||||
`default_nettype none
|
||||
`endif
|
||||
|
||||
module sig_combine #(
|
||||
parameter integer D_WIDTH = 12,
|
||||
parameter integer S_WIDTH = 16,
|
||||
parameter integer S_FRAC = 14
|
||||
)(
|
||||
// Input
|
||||
input wire [D_WIDTH-1:0] in_data_0,
|
||||
input wire [S_WIDTH-1:0] in_scale_0,
|
||||
input wire [D_WIDTH-1:0] in_chain_0,
|
||||
|
||||
// Output
|
||||
output wire [D_WIDTH-1:0] out_3,
|
||||
|
||||
// Control
|
||||
input wire clk,
|
||||
input wire rst
|
||||
);
|
||||
localparam S = 25 - D_WIDTH + S_FRAC;
|
||||
|
||||
// Signals
|
||||
reg [17:0] in_chain_1;
|
||||
|
||||
wire [47:0] pout_3;
|
||||
wire [29:0] a_0;
|
||||
wire [17:0] b_0;
|
||||
wire [47:0] c_1;
|
||||
|
||||
// Align C
|
||||
always @(posedge clk)
|
||||
in_chain_1 <= in_chain_0;
|
||||
|
||||
// Map in/out
|
||||
assign a_0 = { 5'd0, in_data_0, { (25-D_WIDTH){1'b0} } };
|
||||
assign b_0 = { { (18-S_WIDTH){1'b0} }, in_scale_0 };
|
||||
assign c_1 = { { (48-S-D_WIDTH){in_chain_1[D_WIDTH-1]} }, in_chain_1, { (S){1'b0} } };
|
||||
|
||||
assign out_3 = pout_3[S+:D_WIDTH];
|
||||
|
||||
// DSP
|
||||
DSP48E1 #(
|
||||
.A_INPUT("DIRECT"),
|
||||
.B_INPUT("DIRECT"),
|
||||
.USE_DPORT("FALSE"),
|
||||
.USE_MULT("MULTIPLY"),
|
||||
.AUTORESET_PATDET("NO_RESET"),
|
||||
.MASK(48'h3fffffffffff),
|
||||
.PATTERN(48'h000000000000),
|
||||
.SEL_MASK("MASK"),
|
||||
.SEL_PATTERN("PATTERN"),
|
||||
.USE_PATTERN_DETECT("PATDET"),
|
||||
.ACASCREG(1),
|
||||
.ADREG(1),
|
||||
.ALUMODEREG(1),
|
||||
.AREG(1),
|
||||
.BCASCREG(1),
|
||||
.BREG(1),
|
||||
.CARRYINREG(1),
|
||||
.CARRYINSELREG(1),
|
||||
.CREG(1),
|
||||
.DREG(1),
|
||||
.INMODEREG(1),
|
||||
.MREG(1),
|
||||
.OPMODEREG(1),
|
||||
.PREG(1),
|
||||
.USE_SIMD("ONE48")
|
||||
) dsp_I (
|
||||
.P(pout_3),
|
||||
.ACIN(30'h0),
|
||||
.BCIN(18'h0),
|
||||
.CARRYCASCIN(1'h0),
|
||||
.MULTSIGNIN(1'h0),
|
||||
.PCIN(48'h000000000000),
|
||||
.ALUMODE(4'b0000), // Z + X + Y + CIN
|
||||
.CARRYINSEL(3'h0),
|
||||
.CEINMODE(1'b1),
|
||||
.CLK(clk),
|
||||
.INMODE(5'b00000), // B=B2, A=A2
|
||||
.OPMODE(7'b0110101), // X=M1, Y=M2, Z=C
|
||||
.RSTINMODE(rst),
|
||||
.A(a_0),
|
||||
.B(b_0),
|
||||
.C(c_1),
|
||||
.CARRYIN(1'b0),
|
||||
.D(25'd0),
|
||||
.CEA1(1'b0),
|
||||
.CEA2(1'b1),
|
||||
.CEAD(1'b1),
|
||||
.CEALUMODE(1'b1),
|
||||
.CEB1(1'b0),
|
||||
.CEB2(1'b1),
|
||||
.CEC(1'b1),
|
||||
.CECARRYIN(1'b1),
|
||||
.CECTRL(1'b1),
|
||||
.CED(1'b1),
|
||||
.CEM(1'b1),
|
||||
.CEP(1'b1),
|
||||
.RSTA(rst),
|
||||
.RSTALLCARRYIN(rst),
|
||||
.RSTALUMODE(rst),
|
||||
.RSTB(rst),
|
||||
.RSTC(rst),
|
||||
.RSTCTRL(rst),
|
||||
.RSTD(rst),
|
||||
.RSTM(rst),
|
||||
.RSTP(rst)
|
||||
);
|
||||
|
||||
endmodule // sig_combine
|
|
@ -0,0 +1,121 @@
|
|||
/*
|
||||
* sig_delay.c
|
||||
*
|
||||
* Signal delay line - runtime configurable length
|
||||
*
|
||||
* Copyright (C) 2018 sysmocom - systems for mobile communications GmbH
|
||||
*
|
||||
* vim: ts=4 sw=4
|
||||
*/
|
||||
|
||||
`ifdef SIM
|
||||
`default_nettype none
|
||||
`endif
|
||||
|
||||
module sig_delay #(
|
||||
parameter integer WIDTH = 12
|
||||
)(
|
||||
input wire data_valid,
|
||||
input wire [WIDTH-1:0] data_in,
|
||||
output wire [WIDTH-1:0] data_out,
|
||||
input wire [14:0] delay,
|
||||
input wire clk,
|
||||
input wire rst
|
||||
);
|
||||
|
||||
// Signals
|
||||
// -------
|
||||
|
||||
reg [14:0] wr_addr;
|
||||
reg [14:0] rd_addr;
|
||||
wire ce;
|
||||
|
||||
|
||||
// Control
|
||||
// -------
|
||||
|
||||
assign ce = data_valid;
|
||||
|
||||
always @(posedge clk)
|
||||
begin
|
||||
if (rst) begin
|
||||
wr_addr <= 0;
|
||||
rd_addr <= 0;
|
||||
end else if (ce) begin
|
||||
wr_addr <= wr_addr + 1;
|
||||
rd_addr <= wr_addr - delay;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
// Storage
|
||||
// -------
|
||||
|
||||
genvar i;
|
||||
|
||||
generate
|
||||
for (i=0; i<WIDTH; i=i+1)
|
||||
begin
|
||||
// Signals
|
||||
wire [31:0] ram_do;
|
||||
wire [31:0] ram_di;
|
||||
|
||||
// Connections
|
||||
assign data_out[i] = ram_do[0];
|
||||
assign ram_di = { 31'd0, data_in[i] };
|
||||
|
||||
// Instantiate RAM Block
|
||||
RAMB36E1 #(
|
||||
.RDADDR_COLLISION_HWCONFIG("PERFORMANCE"),
|
||||
.SIM_COLLISION_CHECK("NONE"),
|
||||
.DOA_REG(1),
|
||||
.DOB_REG(1),
|
||||
.EN_ECC_READ("FALSE"),
|
||||
.EN_ECC_WRITE("FALSE"),
|
||||
.RAM_EXTENSION_A("NONE"),
|
||||
.RAM_EXTENSION_B("NONE"),
|
||||
.RAM_MODE("TDP"),
|
||||
.READ_WIDTH_A(1),
|
||||
.READ_WIDTH_B(1),
|
||||
.WRITE_WIDTH_A(1),
|
||||
.WRITE_WIDTH_B(1),
|
||||
.RSTREG_PRIORITY_A("RSTREG"),
|
||||
.RSTREG_PRIORITY_B("RSTREG"),
|
||||
.SIM_DEVICE("7SERIES"),
|
||||
.SRVAL_A(36'h000000000),
|
||||
.SRVAL_B(36'h000000000),
|
||||
.WRITE_MODE_A("READ_FIRST"),
|
||||
.WRITE_MODE_B("READ_FIRST")
|
||||
)
|
||||
mem_elem_I (
|
||||
.DOADO(ram_do),
|
||||
.DOPADOP(),
|
||||
.DOBDO(),
|
||||
.DOPBDOP(),
|
||||
.CASCADEINA(1'b0),
|
||||
.CASCADEINB(1'b0),
|
||||
.INJECTDBITERR(1'b0),
|
||||
.INJECTSBITERR(1'b0),
|
||||
.ADDRARDADDR({1'b1, rd_addr}),
|
||||
.CLKARDCLK(clk),
|
||||
.ENARDEN(ce),
|
||||
.REGCEAREGCE(ce),
|
||||
.RSTRAMARSTRAM(rst),
|
||||
.RSTREGARSTREG(rst),
|
||||
.WEA(4'd0),
|
||||
.DIADI(32'd0),
|
||||
.DIPADIP(4'd0),
|
||||
.ADDRBWRADDR({1'b1, wr_addr}),
|
||||
.CLKBWRCLK(clk),
|
||||
.ENBWREN(1'b1),
|
||||
.REGCEB(1'b0),
|
||||
.RSTRAMB(rst),
|
||||
.RSTREGB(rst),
|
||||
.WEBWE({7'd0, ce}),
|
||||
.DIBDI(ram_di),
|
||||
.DIPBDIP(4'd0)
|
||||
);
|
||||
end
|
||||
endgenerate
|
||||
|
||||
endmodule // sig_delay
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,66 @@
|
|||
// $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/glbl.v,v 1.15 2011/08/25 22:54:30 fphillip Exp $
|
||||
|
||||
`timescale 1 ps / 1 ps
|
||||
|
||||
module glbl ();
|
||||
|
||||
parameter ROC_WIDTH = 100000;
|
||||
parameter TOC_WIDTH = 0;
|
||||
|
||||
//-------- STARTUP Globals --------------
|
||||
wire GSR;
|
||||
wire GTS;
|
||||
wire GWE;
|
||||
wire PRLD;
|
||||
tri1 p_up_tmp;
|
||||
tri (weak1, strong0) PLL_LOCKG = p_up_tmp;
|
||||
|
||||
wire PROGB_GLBL;
|
||||
wire CCLKO_GLBL;
|
||||
|
||||
reg GSR_int;
|
||||
reg GTS_int;
|
||||
reg PRLD_int;
|
||||
|
||||
//-------- JTAG Globals --------------
|
||||
wire JTAG_TDO_GLBL;
|
||||
wire JTAG_TCK_GLBL;
|
||||
wire JTAG_TDI_GLBL;
|
||||
wire JTAG_TMS_GLBL;
|
||||
wire JTAG_TRST_GLBL;
|
||||
|
||||
reg JTAG_CAPTURE_GLBL;
|
||||
reg JTAG_RESET_GLBL;
|
||||
reg JTAG_SHIFT_GLBL;
|
||||
reg JTAG_UPDATE_GLBL;
|
||||
reg JTAG_RUNTEST_GLBL;
|
||||
|
||||
reg JTAG_SEL1_GLBL = 0;
|
||||
reg JTAG_SEL2_GLBL = 0 ;
|
||||
reg JTAG_SEL3_GLBL = 0;
|
||||
reg JTAG_SEL4_GLBL = 0;
|
||||
|
||||
reg JTAG_USER_TDO1_GLBL = 1'bz;
|
||||
reg JTAG_USER_TDO2_GLBL = 1'bz;
|
||||
reg JTAG_USER_TDO3_GLBL = 1'bz;
|
||||
reg JTAG_USER_TDO4_GLBL = 1'bz;
|
||||
|
||||
assign (weak1, weak0) GSR = GSR_int;
|
||||
assign (weak1, weak0) GTS = GTS_int;
|
||||
assign (weak1, weak0) PRLD = PRLD_int;
|
||||
|
||||
initial begin
|
||||
GSR_int = 1'b1;
|
||||
PRLD_int = 1'b1;
|
||||
#(ROC_WIDTH)
|
||||
GSR_int = 1'b0;
|
||||
PRLD_int = 1'b0;
|
||||
end
|
||||
|
||||
initial begin
|
||||
GTS_int = 1'b1;
|
||||
#(TOC_WIDTH)
|
||||
GTS_int = 1'b0;
|
||||
end
|
||||
|
||||
endmodule
|
Loading…
Reference in New Issue