initial commit

This commit is contained in:
2023-03-18 15:35:53 +08:00
commit 5965eba577
3222 changed files with 4025781 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
run/
vcd/
@@ -0,0 +1,17 @@
#!/bin/bash
SOURCE="axi_jesd204_rx_regmap_tb.v"
SOURCE+=" ../axi_jesd204_rx/axi_jesd204_rx.v"
SOURCE+=" ../axi_jesd204_rx/jesd204_up_rx.v"
SOURCE+=" ../axi_jesd204_rx/jesd204_up_rx_lane.v"
SOURCE+=" ../axi_jesd204_rx/jesd204_up_ilas_mem.v"
SOURCE+=" ../axi_jesd204_common/jesd204_up_common.v"
SOURCE+=" ../axi_jesd204_common/jesd204_up_sysref.v"
SOURCE+=" ../../common/up_clock_mon.v"
SOURCE+=" ../../common/up_axi.v"
SOURCE+=" ../../util_cdc/sync_bits.v"
SOURCE+=" ../../util_cdc/sync_data.v"
SOURCE+=" ../../util_cdc/sync_event.v"
cd `dirname $0`
source run_tb.sh
@@ -0,0 +1,378 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module axi_jesd204_rx_regmap_tb;
parameter VCD_FILE = "axi_jesd204_rx_regmap_tb.vcd";
parameter NUM_LANES = 2;
parameter NUM_LINKS = 1;
`define TIMEOUT 1000000
`include "tb_base.v"
reg core_clk = 1'b0;
always @(*) #4 core_clk <= ~core_clk;
wire s_axi_aclk = clk;
wire s_axi_aresetn = ~reset;
reg s_axi_awvalid = 1'b0;
reg s_axi_wvalid = 1'b0;
reg [13:0] s_axi_awaddr = 'h00;
reg [31:0] s_axi_wdata = 'h00;
wire [1:0] s_axi_bresp;
wire s_axi_awready;
wire s_axi_wready;
wire s_axi_bready = 1'b1;
wire [3:0] s_axi_wstrb = 4'b1111;
wire [2:0] s_axi_awprot = 3'b000;
wire [2:0] s_axi_arprot = 3'b000;
wire [1:0] s_axi_rresp;
wire [31:0] s_axi_rdata;
wire [NUM_LANES*32-1:0] core_status_err_statistics_cnt;
reg [31:0] expected_reg_mem[0:1023];
task write_reg;
input [31:0] addr;
input [31:0] value;
begin
@(posedge s_axi_aclk)
s_axi_awvalid <= 1'b1;
s_axi_wvalid <= 1'b1;
s_axi_awaddr <= addr;
s_axi_wdata <= value;
@(posedge s_axi_aclk)
while (s_axi_awvalid || s_axi_wvalid) begin
@(posedge s_axi_aclk)
if (s_axi_awready)
s_axi_awvalid <= 1'b0;
if (s_axi_wready)
s_axi_wvalid <= 1'b0;
end
end
endtask
reg [13:0] s_axi_araddr = 'h0;
reg s_axi_arvalid = 'h0;
reg s_axi_rready = 'h0;
wire s_axi_arready;
wire s_axi_rvalid;
task read_reg;
input [31:0] addr;
output [31:0] value;
begin
s_axi_arvalid <= 1'b1;
s_axi_araddr <= addr;
s_axi_rready <= 1'b1;
@(posedge s_axi_aclk) #0;
while (s_axi_arvalid) begin
if (s_axi_arready == 1'b1) begin
s_axi_arvalid <= 1'b0;
end
@(posedge s_axi_aclk) #0;
end
while (s_axi_rready) begin
if (s_axi_rvalid == 1'b1) begin
value <= s_axi_rdata;
s_axi_rready <= 1'b0;
end
@(posedge s_axi_aclk) #0;
end
end
endtask
task read_reg_check;
input [31:0] addr;
output match;
reg [31:0] value;
reg [31:0] expected;
begin
read_reg(addr, value);
expected = expected_reg_mem[addr[13:2]];
match <= value === expected;
if (value !== expected) begin
$display("Address %h, Expected %h, Found %h", addr, expected, value);
end
end
endtask
reg read_match = 1'b1;
always @(posedge clk) begin
if (read_match == 1'b0) begin
failed <= 1'b1;
end
end
task set_reset_reg_value;
input [31:0] addr;
input [31:0] value;
begin
expected_reg_mem[addr[13:2]] <= value;
end
endtask
task initialize_expected_reg_mem;
integer i;
begin
for (i = 0; i < 1024; i = i + 1)
expected_reg_mem[i] <= 'h00;
/* Non zero power-on-reset values */
set_reset_reg_value('h00, 32'h00010261); /* PCORE version register */
set_reset_reg_value('h0c, 32'h32303452); /* PCORE magic register */
set_reset_reg_value('h10, NUM_LANES); /* Number of lanes */
set_reset_reg_value('h18, NUM_LINKS); /* Number of links */
set_reset_reg_value('h40, 32'h00000100); /* Elastic buffer size */
set_reset_reg_value('h14, 'h2); /* Datapath width */
set_reset_reg_value('hc0, 'h1); /* Core reset */
set_reset_reg_value('hc4, 'h1); /* Core state */
// set_reset_reg_value('hc8, 'h28000); /* clock monitor */
set_reset_reg_value('h210, 'h3); /* OCTETS_PER_MULTIFRAME */
/* Lane error statistics */
for (i = 0; i < NUM_LANES; i = i + 1) begin
set_reset_reg_value('h308 + i*'h20, core_status_err_statistics_cnt[32*i+:32]);
end
end
endtask
task check_all_registers;
integer i;
begin
for (i = 0; i < 'h400; i = i + 4) begin
read_reg_check(i, read_match);
end
end
endtask
task write_reg_and_update;
input [31:0] addr;
input [31:0] value;
integer i;
begin
write_reg(addr, value);
expected_reg_mem[addr[13:2]] <= value;
if (addr == 'hc0) begin
expected_reg_mem['hc4/4][0] <= value[0];
end
end
endtask
task invert_register;
input [31:0] addr;
reg [31:0] value;
begin
read_reg(addr, value);
write_reg(addr, ~value);
end
endtask
task invert_all_registers;
integer i;
begin
for (i = 0; i < 'h400; i = i + 4) begin
invert_register(i);
end
end
endtask
/* ILAS memory */
reg core_ilas_config_valid = 1'b0;
reg [1:0] core_ilas_config_addr = 2'b00;
wire [NUM_LANES*32-1:0] core_ilas_config_data;
generate
genvar l;
for (l = 0; l < NUM_LANES; l = l + 1) begin
localparam [3:0] l2 = l;
assign core_ilas_config_data[32*l+31:32*l] = {
l2,core_ilas_config_addr,2'h3,
l2,core_ilas_config_addr,2'h2,
l2,core_ilas_config_addr,2'h1,
l2,core_ilas_config_addr,2'h0
};
assign core_status_err_statistics_cnt[32*l+:32] = {28'hffaa550,l2};
end
endgenerate
task set_ilas_registers;
integer i;
reg [3:0] lane;
begin
for (i = 0; i < 4; i = i + 1) begin
@(posedge core_clk)
core_ilas_config_valid <= 1'b1;
core_ilas_config_addr <= i;
end
@(posedge core_clk)
core_ilas_config_valid <= 1'b0;
core_ilas_config_addr <= 0;
@(posedge core_clk) #0;
/* Update the expected values */
for (i = 0; i < NUM_LANES * 'h20; i = i + 'h20) begin
lane = i / 20;
set_reset_reg_value('h300 + i, 'h20);
set_reset_reg_value('h310 + i, 'h03020100 | {4{lane,4'h0}});
set_reset_reg_value('h314 + i, 'h07060504 | {4{lane,4'h0}});
set_reset_reg_value('h318 + i, 'h0b0a0908 | {4{lane,4'h0}});
set_reset_reg_value('h31c + i, 'h0f0e0d0c | {4{lane,4'h0}});
end
end
endtask
integer i;
initial begin
#1;
initialize_expected_reg_mem();
@(posedge s_axi_aresetn)
check_all_registers();
/* Check scratch */
write_reg_and_update('h08, 32'h12345678);
check_all_registers();
/* Check IRQ mask */
write_reg_and_update('h80, 32'h0);
check_all_registers();
/* Check lanes enable */
write_reg_and_update('h200, {NUM_LANES{1'b1}});
check_all_registers();
/* Check JESD common config */
write_reg_and_update('h210, 32'hff03ff);
check_all_registers();
write_reg_and_update('h214, 32'h03);
check_all_registers();
/* Check links enable */
write_reg_and_update('h218, {NUM_LINKS{1'b1}});
check_all_registers();
/* Check JESD RX configuration */
write_reg_and_update('h240, 32'h103fc);
check_all_registers();
/* Reset core */
write_reg_and_update('hc0, 32'h0);
check_all_registers();
/* Should be read-only when core is out of reset */
invert_register('h200); /* lanes enable */
invert_register('h210); /* octets per frame, beats per multiframe */
invert_register('h218); /* links enable */
invert_register('h240); /* char replacement, scrambler */
check_all_registers();
/* Check ILAS */
set_ilas_registers();
check_all_registers();
/* Check that reset works for all registers */
do_trigger_reset();
initialize_expected_reg_mem();
check_all_registers();
invert_all_registers();
do_trigger_reset();
check_all_registers();
end
axi_jesd204_rx #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS)
) i_axi (
.s_axi_aclk(s_axi_aclk),
.s_axi_aresetn(s_axi_aresetn),
.s_axi_awvalid(s_axi_awvalid),
.s_axi_awaddr(s_axi_awaddr),
.s_axi_awready(s_axi_awready),
.s_axi_awprot(s_axi_awprot),
.s_axi_wvalid(s_axi_wvalid),
.s_axi_wdata(s_axi_wdata),
.s_axi_wstrb(s_axi_wstrb),
.s_axi_wready(s_axi_wready),
.s_axi_bvalid(s_axi_bvalid),
.s_axi_bresp(s_axi_bresp),
.s_axi_bready(s_axi_bready),
.s_axi_arvalid(s_axi_arvalid),
.s_axi_araddr(s_axi_araddr),
.s_axi_arready(s_axi_arready),
.s_axi_arprot(s_axi_arprot),
.s_axi_rvalid(s_axi_rvalid),
.s_axi_rready(s_axi_rready),
.s_axi_rresp(s_axi_rresp),
.s_axi_rdata(s_axi_rdata),
.core_clk(core_clk),
.core_reset_ext(1'b0),
.core_ilas_config_valid({NUM_LANES{core_ilas_config_valid}}),
.core_ilas_config_addr({NUM_LANES{core_ilas_config_addr}}),
.core_ilas_config_data(core_ilas_config_data),
.core_event_sysref_alignment_error(1'b0),
.core_event_sysref_edge(1'b0),
.core_status_err_statistics_cnt(core_status_err_statistics_cnt),
.core_ctrl_err_statistics_mask(),
.core_ctrl_err_statistics_reset(),
.core_status_ctrl_state(2'b00),
.core_status_lane_cgs_state(4'b0000),
.core_status_lane_ifs_ready({NUM_LANES{1'b0}}),
.core_status_lane_latency({NUM_LANES{14'h00}})
);
endmodule
@@ -0,0 +1,15 @@
#!/bin/bash
SOURCE="axi_jesd204_tx_regmap_tb.v"
SOURCE+=" ../axi_jesd204_tx/axi_jesd204_tx.v"
SOURCE+=" ../axi_jesd204_tx/jesd204_up_tx.v"
SOURCE+=" ../axi_jesd204_common/jesd204_up_common.v"
SOURCE+=" ../axi_jesd204_common/jesd204_up_sysref.v"
SOURCE+=" ../../common/up_axi.v"
SOURCE+=" ../../common/up_clock_mon.v"
SOURCE+=" ../../util_cdc/sync_bits.v"
SOURCE+=" ../../util_cdc/sync_data.v"
SOURCE+=" ../../util_cdc/sync_event.v"
cd `dirname $0`
source run_tb.sh
@@ -0,0 +1,366 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module axi_jesd204_tx_regmap_tb;
parameter VCD_FILE = "axi_jesd204_tx_regmap_tb.vcd";
parameter NUM_LANES = 2;
parameter NUM_LINKS = 2;
`define TIMEOUT 1000000
`include "tb_base.v"
reg [1:0] core_status_state = 2'b00;
reg [NUM_LINKS-1:0] core_status_sync = {NUM_LINKS{1'b0}};
wire s_axi_aclk = clk;
wire s_axi_aresetn = ~reset;
reg s_axi_awvalid = 1'b0;
reg s_axi_wvalid = 1'b0;
reg [13:0] s_axi_awaddr = 'h00;
reg [31:0] s_axi_wdata = 'h00;
wire [1:0] s_axi_bresp;
wire s_axi_awready;
wire s_axi_wready;
wire s_axi_bready = 1'b1;
wire [3:0] s_axi_wstrb = 4'b1111;
wire [2:0] s_axi_awprot = 3'b000;
wire [2:0] s_axi_arprot = 3'b000;
wire [1:0] s_axi_rresp;
wire [31:0] s_axi_rdata;
reg [31:0] expected_reg_mem[0:1023];
task write_reg;
input [31:0] addr;
input [31:0] value;
begin
@(posedge s_axi_aclk)
s_axi_awvalid <= 1'b1;
s_axi_wvalid <= 1'b1;
s_axi_awaddr <= addr;
s_axi_wdata <= value;
@(posedge s_axi_aclk)
while (s_axi_awvalid || s_axi_wvalid) begin
@(posedge s_axi_aclk)
if (s_axi_awready)
s_axi_awvalid <= 1'b0;
if (s_axi_wready)
s_axi_wvalid <= 1'b0;
end
end
endtask
reg [13:0] s_axi_araddr = 'h0;
reg s_axi_arvalid = 'h0;
reg s_axi_rready = 'h0;
wire s_axi_arready;
wire s_axi_rvalid;
task read_reg;
input [31:0] addr;
output [31:0] value;
begin
s_axi_arvalid <= 1'b1;
s_axi_araddr <= addr;
s_axi_rready <= 1'b1;
@(posedge s_axi_aclk) #0;
while (s_axi_arvalid) begin
if (s_axi_arready == 1'b1) begin
s_axi_arvalid <= 1'b0;
end
@(posedge s_axi_aclk) #0;
end
while (s_axi_rready) begin
if (s_axi_rvalid == 1'b1) begin
value <= s_axi_rdata;
s_axi_rready <= 1'b0;
end
@(posedge s_axi_aclk) #0;
end
end
endtask
task read_reg_check;
input [31:0] addr;
output match;
reg [31:0] value;
reg [31:0] expected;
begin
read_reg(addr, value);
expected = expected_reg_mem[addr[13:2]];
match <= value === expected;
end
endtask
reg read_match = 1'b1;
always @(posedge clk) begin
if (read_match == 1'b0) begin
failed <= 1'b1;
end
end
task set_reset_reg_value;
input [31:0] addr;
input [31:0] value;
begin
expected_reg_mem[addr[13:2]] <= value;
end
endtask
task initialize_expected_reg_mem;
integer i;
begin
for (i = 0; i < 1024; i = i + 1)
expected_reg_mem[i] <= 'h00;
/* Non zero power-on-reset values */
set_reset_reg_value('h00, 32'h00010161); /* PCORE version register */
set_reset_reg_value('h0c, 32'h32303454); /* PCORE magic register */
set_reset_reg_value('h10, NUM_LANES); /* Number of lanes */
set_reset_reg_value('h14, 'h2); /* Datapath width */
set_reset_reg_value('h18, NUM_LINKS); /* Number of links */
set_reset_reg_value('hc0, 'h1); /* Link disable */
set_reset_reg_value('hc4, 'h1); /* Core state */
// set_reset_reg_value('hc8, 'h80000); /* clock monitor */
set_reset_reg_value('h210, 'h3); /* OCTETS_PER_MULTIFRAME */
set_reset_reg_value('h244, 'h3); /* MFRAMES_PER_ILAS */
end
endtask
task check_all_registers;
integer i;
begin
for (i = 0; i < 'h400; i = i + 4) begin
read_reg_check(i, read_match);
end
end
endtask
task write_reg_and_update;
input [31:0] addr;
input [31:0] value;
integer i;
begin
write_reg(addr, value);
expected_reg_mem[addr[13:2]] <= value;
/* Special case for ILAS */
if (addr >= 'h310 && addr < 'h310 + 32 * NUM_LANES) begin
for (i = 0; i < NUM_LANES; i = i + 1) begin
case (addr[3:2])
2'b01: expected_reg_mem['h310/4 + i * 8 + 1][31:5] <= value[31:5];
2'b11: expected_reg_mem['h310/4 + i * 8 + 3][23:0] <= value[23:0];
default: expected_reg_mem['h310/4 + i * 8 + addr[3:2]] <= value;
endcase
end
end
if (addr == 'hc0) begin
expected_reg_mem['hc4/4][0] <= value[0];
end
end
endtask
task invert_register;
input [31:0] addr;
reg [31:0] value;
begin
read_reg(addr, value);
write_reg(addr, ~value);
end
endtask
task invert_all_registers;
integer i;
begin
for (i = 0; i < 'h400; i = i + 4) begin
invert_register(i);
end
end
endtask
integer i;
initial begin
initialize_expected_reg_mem();
@(posedge s_axi_aresetn)
check_all_registers();
/* Check scratch */
write_reg_and_update('h08, 32'h12345678);
check_all_registers();
/* Check IRQ mask */
write_reg_and_update('h80, 32'h0);
check_all_registers();
/* Check lanes disable */
write_reg_and_update('h200, {NUM_LANES{1'b1}});
check_all_registers();
/* Check JESD common config */
write_reg_and_update('h210, 32'hff03ff);
check_all_registers();
write_reg_and_update('h214, 32'h03);
check_all_registers();
/* Check links disable */
write_reg_and_update('h218, {NUM_LINKS{1'b1}});
check_all_registers();
/* Check JESD TX configuration */
write_reg_and_update('h240, 32'h07);
check_all_registers();
/* Check mframes per ILAS - RO at the moment */
write_reg('h244, 32'hff);
check_all_registers();
/* Check status register */
core_status_state = 2'b01; /* CGS */
set_reset_reg_value('h280, 32'h00000001);
check_all_registers();
core_status_state = 2'b10; /* ILAS */
set_reset_reg_value('h280, 32'h00000002);
check_all_registers();
core_status_state = 2'b11; /* DATA */
set_reset_reg_value('h280, 32'h00000003);
check_all_registers();
core_status_state = 2'b00; /* WAIT */
set_reset_reg_value('h280, 32'h00000000);
check_all_registers();
core_status_sync = {NUM_LINKS{1'b1}}; /* SYNC deasserted */
set_reset_reg_value('h280, ({NUM_LINKS{1'b1}} << 4));
check_all_registers();
core_status_sync = {NUM_LINKS{1'b0}}; /* SYNC asserted */
set_reset_reg_value('h280, 32'h00000000);
check_all_registers();
/* ILAS register */
for (i = 0; i < NUM_LANES; i = i + 1) begin
write_reg_and_update('h310 + i * 32, 32'h0fff0000);
write_reg_and_update('h314 + i * 32, 32'h1fff9f1f ^ i);
write_reg_and_update('h318 + i * 32, 32'hffffdfff ^ i);
write_reg_and_update('h31c + i * 32, 32'h0f00009f ^ (2 << 24));
end
check_all_registers();
/* Reset core */
write_reg_and_update('hc0, 32'h0);
check_all_registers();
/* Should be read-only when core is out of reset */
invert_register('h200);
invert_register('h210);
invert_register('h214);
invert_register('h218);
invert_register('h240);
invert_register('h244);
for (i = 0; i < NUM_LANES; i = i + 1) begin
invert_register('h310 + i * 32);
invert_register('h314 + i * 32);
invert_register('h318 + i * 32);
invert_register('h31c + i * 32);
end
check_all_registers();
/* Check that reset works for all registers */
do_trigger_reset();
initialize_expected_reg_mem();
check_all_registers();
invert_all_registers();
do_trigger_reset();
check_all_registers();
end
reg core_clk = 1'b0;
always @(*) #4 core_clk <= ~core_clk;
axi_jesd204_tx #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS)
) i_axi (
.s_axi_aclk(s_axi_aclk),
.s_axi_aresetn(s_axi_aresetn),
.s_axi_awvalid(s_axi_awvalid),
.s_axi_awaddr(s_axi_awaddr),
.s_axi_awready(s_axi_awready),
.s_axi_awprot(s_axi_awprot),
.s_axi_wvalid(s_axi_wvalid),
.s_axi_wdata(s_axi_wdata),
.s_axi_wstrb(s_axi_wstrb),
.s_axi_wready(s_axi_wready),
.s_axi_bvalid(s_axi_bvalid),
.s_axi_bresp(s_axi_bresp),
.s_axi_bready(s_axi_bready),
.s_axi_arvalid(s_axi_arvalid),
.s_axi_araddr(s_axi_araddr),
.s_axi_arready(s_axi_arready),
.s_axi_arprot(s_axi_arprot),
.s_axi_rvalid(s_axi_rvalid),
.s_axi_rready(s_axi_rready),
.s_axi_rresp(s_axi_rresp),
.s_axi_rdata(s_axi_rdata),
.core_clk(core_clk),
.core_reset_ext(1'b0),
.core_ilas_config_rd(1'b1),
.core_ilas_config_addr(2'b00),
.core_event_sysref_alignment_error(1'b0),
.core_event_sysref_edge(1'b0),
.core_status_state(core_status_state),
.core_status_sync(core_status_sync)
);
endmodule
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
SOURCE="crc12_tb.v"
SOURCE+=" ../jesd204_common/jesd204_crc12.v"
cd `dirname $0`
source run_tb.sh
+105
View File
@@ -0,0 +1,105 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module crc12_tb;
parameter VCD_FILE = "crc12_tb.vcd";
`define TIMEOUT 400
`include "tb_base.v"
reg [63:0] data_in = 'h0;
reg [11:0] ref_crc12 = 'h0;
wire [11:0] crc12;
reg test_en = 1'b1;
reg init = 1'b0;
jesd204_crc12 DUT (
.clk (clk),
.reset (1'b0),
.init (init),
.data_in (data_in),
.crc12 (crc12)
);
// Test against dataset from the standard
// - Test contiguous input stream with init phase
initial begin
@(negedge reset);
@(posedge clk);
repeat (3) begin
@(posedge clk) data_in <= 'h80_01_02_03_05_05_04_23;
init <= 1'b1;
@(posedge clk) data_in <= 'h0e_43_80_c2_0b_50_81_cd;
init <= 1'b0;
@(posedge clk) data_in <= 'h04_e7_83_92_5a_3c_aa_51;
@(posedge clk) data_in <= 'h05_4d_87_d9_31_3d_11_51;
end
@(posedge clk);
@(posedge clk);
test_en <= 1'b0;
end
initial begin
@(negedge reset);
@(posedge clk);
@(posedge clk);
repeat(3) begin
@(posedge clk) ref_crc12 <= 'hd00;
@(posedge clk) ref_crc12 <= 'h11c;
@(posedge clk) ref_crc12 <= 'hfea;
@(posedge clk) ref_crc12 <= 'h5fe;
end
end
always @(posedge clk) begin
if (ref_crc12 != crc12 && failed == 1'b0 && test_en) begin
failed <= 1'b1;
end
end
endmodule
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
SOURCE="frame_align_tb.v"
SOURCE+=" ../jesd204_common/jesd204_lmfc.v ../jesd204_common/jesd204_scrambler.v ../jesd204_common/jesd204_eof_generator.v"
SOURCE+=" ../jesd204_common/pipeline_stage.v"
SOURCE+=" ../jesd204_rx/jesd204_rx.v ../jesd204_rx/jesd204_rx_lane.v"
SOURCE+=" ../jesd204_rx/jesd204_ilas_monitor.v ../jesd204_rx/align_mux.v ../jesd204_rx/jesd204_rx_cgs.v"
SOURCE+=" ../jesd204_rx/jesd204_rx_ctrl.v ../jesd204_rx/elastic_buffer.v ../jesd204_rx/jesd204_lane_latency_monitor.v"
SOURCE+=" ../jesd204_rx/jesd204_rx_frame_mark.v ../jesd204_rx/jesd204_rx_frame_align_monitor.v"
SOURCE+=" ../jesd204_rx_static_config/jesd204_rx_static_config.v"
SOURCE+=" ../jesd204_tx/jesd204_tx.v ../jesd204_tx/jesd204_tx_ctrl.v ../jesd204_tx/jesd204_tx_lane.v"
SOURCE+=" ../jesd204_tx_static_config/jesd204_tx_static_config.v"
SOURCE+=" ../jesd204_tx_static_config/jesd204_ilas_cfg_static.v"
SOURCE+=" ../../util_cdc/sync_bits.v"
cd `dirname $0`
source run_tb.sh
+386
View File
@@ -0,0 +1,386 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module frame_align_tb;
parameter VCD_FILE = "frame_align_tb.vcd";
parameter NUM_LANES = 4;
parameter NUM_LINKS = 1;
parameter OCTETS_PER_FRAME = 4;
parameter FRAMES_PER_MULTIFRAME = 16;
parameter ENABLE_SCRAMBLER = 1;
parameter BUFFER_EARLY_RELEASE = 1;
parameter LANE_DELAY = 1;
parameter ALIGN_ERROR_PERCENT = 50;
localparam BEATS_PER_MULTIFRAME = OCTETS_PER_FRAME * FRAMES_PER_MULTIFRAME / 4;
localparam TX_LATENCY = 3;
localparam RX_LATENCY = 3;
localparam BASE_LATENCY = TX_LATENCY + RX_LATENCY;
`define TIMEOUT 1000000
`include "tb_base.v"
reg [5:0] tx_counter = 'h00;
reg [5:0] rx_counter = 'h00;
reg [NUM_LANES*32-1:0] rx_mask = 'hffff0000;
wire tx_ready;
wire rx_valid;
wire [NUM_LANES*32-1:0] rx_data;
reg data_mismatch = 1'b1;
wire [NUM_LINKS-1:0] sync;
always @(posedge clk) begin
if (sync == 1'b0) begin
tx_counter <= 'h00000000;
end else if (tx_ready == 1'b1) begin
tx_counter <= tx_counter + 1'b1;
end
end
always @(posedge clk) begin
if (sync == 1'b0) begin
rx_counter <= 'h00000000;
if (ENABLE_SCRAMBLER == 1'b1) begin
rx_mask <= {NUM_LANES{32'hffff0000}}; // First two octets are invalid due to scrambling
end else begin
rx_mask <= {NUM_LANES{32'hffffffff}};
end
end else if (rx_valid == 1'b1) begin
rx_counter <= rx_counter + 1'b1;
rx_mask <= {NUM_LANES{32'hffffffff}};
end
end
wire [31:0] tx_data = {tx_counter,2'h3,tx_counter,2'h2,tx_counter,2'h1,tx_counter,2'h0};
wire [31:0] rx_ref_data = {rx_counter,2'h3,rx_counter,2'h2,rx_counter,2'h1,rx_counter,2'h0};
wire [NUM_LANES*32-1:0] phy_data_out;
wire [NUM_LANES*4-1:0] phy_charisk_out;
wire [NUM_LANES*32-1:0] phy_data_delayed;
wire [NUM_LANES*4-1:0] phy_charisk_delayed;
reg [NUM_LANES*32-1:0] phy_data_in;
reg [NUM_LANES*4-1:0] phy_charisk_in;
reg align_err_mf;
reg align_err_f;
reg cur_err;
reg [5:0] sysref_counter = 'h00;
reg sysref_rx = 1'b0;
reg sysref_tx = 1'b0;
always @(posedge clk) begin
if (sysref_counter == 'h2f)
sysref_rx <= ~sysref_rx;
sysref_counter <= sysref_counter + 1'b1;
sysref_tx <= sysref_rx;
end
localparam MAX_LANE_DELAY = LANE_DELAY + NUM_LANES;
reg [10:0] phy_delay_fifo_wr;
reg [36*NUM_LANES-1:0] phy_delay_fifo[0:MAX_LANE_DELAY-1];
always @(posedge clk) begin
phy_delay_fifo[phy_delay_fifo_wr] <= {phy_charisk_out,phy_data_out};
if (reset == 1'b1 || phy_delay_fifo_wr == MAX_LANE_DELAY-1) begin
phy_delay_fifo_wr <= 'h00;
end else begin
phy_delay_fifo_wr <= phy_delay_fifo_wr + 1'b1;
end
end
initial begin
align_err_mf = 1'b0;
align_err_f = 1'b0;
#100000;
align_err_f = 1'b1;
#50000;
align_err_f = 1'b0;
#100000;
align_err_mf = 1'b1;
#50000;
align_err_mf = 1'b0;
#100000;
align_err_f = 1'b1;
align_err_mf = 1'b1;
#50000;
align_err_f = 1'b0;
align_err_mf = 1'b0;
#100000;
end
always @(posedge clk) begin
if(ALIGN_ERROR_PERCENT != 0) begin
cur_err <= $urandom_range(99) < ALIGN_ERROR_PERCENT;
end else begin
cur_err <= 1'b0;
end
end
genvar i;
generate for (i = 0; i < NUM_LANES; i = i + 1) begin
localparam OFF = MAX_LANE_DELAY - (i + LANE_DELAY);
assign phy_data_delayed[32*i+31:32*i] =
phy_delay_fifo[(phy_delay_fifo_wr + OFF) % MAX_LANE_DELAY][32*i+31:32*i];
assign phy_charisk_delayed[4*i+3:4*i] =
phy_delay_fifo[(phy_delay_fifo_wr + OFF) % MAX_LANE_DELAY][4*i+3+NUM_LANES*32:4*i+32*NUM_LANES];
end endgenerate
always @(*) begin
phy_data_in = phy_data_delayed;
phy_charisk_in = phy_charisk_delayed;
if(cur_err) begin
if(align_err_mf) begin
phy_data_in = {NUM_LANES*4{8'h7C}};
phy_charisk_in = {NUM_LANES*4{1'b1}};
end else if(align_err_f) begin
phy_data_in = {NUM_LANES*4{8'hFC}};
phy_charisk_in = {NUM_LANES*4{1'b1}};
end
end
end
wire [NUM_LANES-1:0] tx_cfg_lanes_disable;
wire [NUM_LINKS-1:0] tx_cfg_links_disable;
wire [7:0] tx_cfg_beats_per_multiframe;
wire [7:0] tx_cfg_octets_per_frame;
wire [7:0] tx_cfg_lmfc_offset;
wire tx_cfg_sysref_disable;
wire tx_cfg_sysref_oneshot;
wire tx_cfg_continuous_cgs;
wire tx_cfg_continuous_ilas;
wire tx_cfg_skip_ilas;
wire [7:0] tx_cfg_mframes_per_ilas;
wire tx_cfg_disable_char_replacement;
wire tx_cfg_disable_scrambler;
wire tx_ilas_config_rd;
wire [1:0] tx_ilas_config_addr;
wire [32*NUM_LANES-1:0] tx_ilas_config_data;
jesd204_tx_static_config #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS),
.OCTETS_PER_FRAME(OCTETS_PER_FRAME),
.FRAMES_PER_MULTIFRAME(FRAMES_PER_MULTIFRAME),
.SCR(ENABLE_SCRAMBLER)
) i_tx_cfg (
.clk(clk),
.cfg_lanes_disable(tx_cfg_lanes_disable),
.cfg_links_disable(tx_cfg_links_disable),
.cfg_beats_per_multiframe(tx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(tx_cfg_octets_per_frame),
.cfg_lmfc_offset(tx_cfg_lmfc_offset),
.cfg_sysref_disable(tx_cfg_sysref_disable),
.cfg_sysref_oneshot(tx_cfg_sysref_oneshot),
.cfg_continuous_cgs(tx_cfg_continuous_cgs),
.cfg_continuous_ilas(tx_cfg_continuous_ilas),
.cfg_skip_ilas(tx_cfg_skip_ilas),
.cfg_mframes_per_ilas(tx_cfg_mframes_per_ilas),
.cfg_disable_char_replacement(tx_cfg_disable_char_replacement),
.cfg_disable_scrambler(tx_cfg_disable_scrambler),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data)
);
jesd204_tx #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS)
) i_tx (
.clk(clk),
.reset(reset),
.cfg_lanes_disable(tx_cfg_lanes_disable),
.cfg_links_disable(tx_cfg_links_disable),
.cfg_beats_per_multiframe(tx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(tx_cfg_octets_per_frame),
.cfg_lmfc_offset(tx_cfg_lmfc_offset),
.cfg_sysref_disable(tx_cfg_sysref_disable),
.cfg_sysref_oneshot(tx_cfg_sysref_oneshot),
.cfg_continuous_cgs(tx_cfg_continuous_cgs),
.cfg_continuous_ilas(tx_cfg_continuous_ilas),
.cfg_skip_ilas(tx_cfg_skip_ilas),
.cfg_mframes_per_ilas(tx_cfg_mframes_per_ilas),
.cfg_disable_char_replacement(tx_cfg_disable_char_replacement),
.cfg_disable_scrambler(tx_cfg_disable_scrambler),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data),
.ctrl_manual_sync_request(1'b0),
.tx_ready(tx_ready),
.tx_data({NUM_LANES{tx_data}}),
.sync(sync),
.sysref(sysref_tx),
.phy_data(phy_data_out),
.phy_charisk(phy_charisk_out)
);
wire [NUM_LANES-1:0] rx_cfg_lanes_disable;
wire [NUM_LINKS-1:0] rx_cfg_links_disable;
wire [7:0] rx_cfg_beats_per_multiframe;
wire [7:0] rx_cfg_octets_per_frame;
wire [7:0] rx_cfg_lmfc_offset;
wire rx_sysref_disable;
wire rx_sysref_oneshot;
wire rx_cfg_disable_scrambler;
wire rx_cfg_disable_char_replacement;
wire rx_cfg_buffer_early_release;
wire [7:0] rx_cfg_buffer_delay;
wire [NUM_LANES-1:0] rx_status_lane_ifs_ready;
wire [NUM_LANES*14-1:0] rx_status_lane_latency;
wire [NUM_LANES*8-1:0] rx_status_lane_frame_align_err_cnt;
wire [7:0] rx_cfg_frame_align_err_threshold;
jesd204_rx_static_config #(
.NUM_LANES(NUM_LANES),
.OCTETS_PER_FRAME(OCTETS_PER_FRAME),
.FRAMES_PER_MULTIFRAME(FRAMES_PER_MULTIFRAME),
.SCR(ENABLE_SCRAMBLER),
.BUFFER_EARLY_RELEASE(BUFFER_EARLY_RELEASE)
) i_rx_cfg (
.clk(clk),
.cfg_lanes_disable(rx_cfg_lanes_disable),
.cfg_links_disable(rx_cfg_links_disable),
.cfg_beats_per_multiframe(rx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(rx_cfg_octets_per_frame),
.cfg_lmfc_offset(rx_cfg_lmfc_offset),
.cfg_sysref_disable(rx_cfg_sysref_disable),
.cfg_sysref_oneshot(rx_cfg_sysref_oneshot),
.cfg_disable_scrambler(rx_cfg_disable_scrambler),
.cfg_disable_char_replacement(rx_cfg_disable_char_replacement),
.cfg_buffer_delay(rx_cfg_buffer_delay),
.cfg_buffer_early_release(rx_cfg_buffer_early_release),
.cfg_frame_align_err_threshold(rx_cfg_frame_align_err_threshold)
);
jesd204_rx #(
.NUM_LANES(NUM_LANES),
.ENABLE_FRAME_ALIGN_CHECK(1),
.ENABLE_FRAME_ALIGN_ERR_RESET(1)
) i_rx (
.clk(clk),
.reset(reset),
.cfg_lanes_disable(rx_cfg_lanes_disable),
.cfg_links_disable(rx_cfg_links_disable),
.cfg_beats_per_multiframe(rx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(rx_cfg_octets_per_frame),
.cfg_lmfc_offset(rx_cfg_lmfc_offset),
.cfg_sysref_disable(rx_cfg_sysref_disable),
.cfg_sysref_oneshot(rx_cfg_sysref_oneshot),
.cfg_disable_scrambler(rx_cfg_disable_scrambler),
.cfg_disable_char_replacement(rx_cfg_disable_char_replacement),
.cfg_buffer_delay(rx_cfg_buffer_delay),
.cfg_buffer_early_release(rx_cfg_buffer_early_release),
.cfg_frame_align_err_threshold(rx_cfg_frame_align_err_threshold),
.sync(sync),
.sysref(sysref_rx),
.rx_data(rx_data),
.rx_valid(rx_valid),
.phy_data(phy_data_in),
.phy_charisk(phy_charisk_in),
.phy_notintable({NUM_LANES{4'b0000}}),
.phy_disperr({NUM_LANES{4'b0000}}),
.status_lane_ifs_ready(rx_status_lane_ifs_ready),
.status_lane_latency(rx_status_lane_latency),
.status_lane_frame_align_err_cnt(rx_status_lane_frame_align_err_cnt)
);
always @(posedge clk) begin
if (reset == 1'b1) begin
data_mismatch <= 1'b0;
end else if (rx_valid == 1'b1) begin
if ((rx_data & rx_mask) !== ({NUM_LANES{rx_ref_data}} & rx_mask)) begin
data_mismatch <= 1'b1;
end
end
end
reg [NUM_LANES-1:0] lane_latency_match;
generate for (i = 0; i < NUM_LANES; i = i + 1) begin
localparam LANE_OFFSET = BASE_LATENCY + LANE_DELAY + BEATS_PER_MULTIFRAME + i;
always @(posedge clk) begin
if (rx_status_lane_ifs_ready[i] == 1'b1 &&
rx_status_lane_latency[i*14+13:i*14+2] == LANE_OFFSET) begin
lane_latency_match[i] <= 1'b1;
end else begin
lane_latency_match[i] <= 1'b0;
end
end
end endgenerate
always @(*) begin
if (rx_valid !== 1'b1 || tx_ready !== 1'b1 || data_mismatch == 1'b1 ||
&lane_latency_match != 1'b1) begin
failed <= 1'b1;
end else begin
failed <= 1'b0;
end
end
endmodule
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
SOURCE="loopback_64b_tb.v"
SOURCE+=" ../jesd204_common/jesd204_lmfc.v ../jesd204_common/jesd204_scrambler.v ../jesd204_common/jesd204_eof_generator.v"
SOURCE+=" ../jesd204_common/pipeline_stage.v"
SOURCE+=" ../jesd204_common/jesd204_scrambler_64b.v ../jesd204_common/jesd204_crc12.v"
SOURCE+=" ../jesd204_rx/jesd204_rx.v ../jesd204_rx/jesd204_rx_ctrl_64b.v ../jesd204_rx/jesd204_rx_lane_64b.v"
SOURCE+=" ../jesd204_rx/elastic_buffer.v ../jesd204_rx/error_monitor.v ../jesd204_rx/jesd204_rx_header.v"
SOURCE+=" ../jesd204_rx_static_config/jesd204_rx_static_config.v"
SOURCE+=" ../jesd204_tx/jesd204_tx.v ../jesd204_tx/jesd204_tx_lane_64b.v ../jesd204_tx/jesd204_tx_header.v"
SOURCE+=" ../jesd204_tx_static_config/jesd204_tx_static_config.v"
SOURCE+=" ../jesd204_tx_static_config/jesd204_ilas_cfg_static.v"
SOURCE+=" ../../util_cdc/sync_bits.v"
cd `dirname $0`
source run_tb.sh
+360
View File
@@ -0,0 +1,360 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module loopback_64b_tb;
parameter VCD_FILE = "loopback_64b_tb.vcd";
parameter NUM_LANES = 4;
parameter NUM_LINKS = 1;
parameter OCTETS_PER_FRAME = 8;
parameter FRAMES_PER_MULTIFRAME = 32;
parameter ENABLE_SCRAMBLER = 1;
parameter BUFFER_EARLY_RELEASE = 0;
parameter LANE_DELAY = 1;
localparam BEATS_PER_MULTIFRAME = OCTETS_PER_FRAME * FRAMES_PER_MULTIFRAME / 8;
localparam TX_LATENCY = 3;
localparam RX_LATENCY = 3;
localparam BASE_LATENCY = TX_LATENCY + RX_LATENCY;
`include "tb_base.v"
reg [5:0] tx_counter = 'h00;
reg [5:0] rx_counter = 'h00;
wire tx_ready;
wire rx_valid;
wire [NUM_LANES*64-1:0] rx_data;
reg data_mismatch = 1'b1;
always @(posedge clk) begin
if (tx_ready == 1'b1) begin
tx_counter <= tx_counter + 1'b1;
end
end
reg rx_valid_d1 = 1'b0;
always @(posedge clk) begin
rx_valid_d1 <= rx_valid;
if (rx_valid == 1'b1) begin
if (rx_valid_d1 == 1'b0) begin
// Resynchronize counter to the first received data
rx_counter <= rx_data[7:2] + 1'b1;
end else begin
rx_counter <= rx_counter + 1'b1;
end
end
end
wire [63:0] tx_data =
{{tx_counter,2'h0,tx_counter,2'h1,tx_counter,2'h2,tx_counter,2'h3},
{tx_counter,2'h3,tx_counter,2'h2,tx_counter,2'h1,tx_counter,2'h0}};
wire [63:0] rx_ref_data =
{{rx_counter,2'h0,rx_counter,2'h1,rx_counter,2'h2,rx_counter,2'h3},
{rx_counter,2'h3,rx_counter,2'h2,rx_counter,2'h1,rx_counter,2'h0}};
wire [NUM_LANES*64-1:0] phy_data_out;
wire [NUM_LANES*2-1:0] phy_header_out;
wire [NUM_LANES*64-1:0] phy_data_in;
wire [NUM_LANES*2-1:0] phy_header_in;
reg [NUM_LANES-1:0] phy_block_sync = {NUM_LANES{1'b1}};
reg [5:0] sysref_counter = 'h00;
reg sysref_rx = 1'b0;
reg sysref_tx = 1'b0;
always @(posedge clk) begin
if (sysref_counter == 'h2f)
sysref_rx <= ~sysref_rx;
sysref_counter <= sysref_counter + 1'b1;
sysref_tx <= sysref_rx;
end
localparam MAX_LANE_DELAY = LANE_DELAY + NUM_LANES;
reg [10:0] phy_delay_fifo_wr;
reg [(2+64)*NUM_LANES-1:0] phy_delay_fifo[0:MAX_LANE_DELAY-1];
always @(posedge clk) begin
phy_delay_fifo[phy_delay_fifo_wr] <= {phy_header_out,phy_data_out};
if (reset == 1'b1 || phy_delay_fifo_wr == MAX_LANE_DELAY-1) begin
phy_delay_fifo_wr <= 'h00;
end else begin
phy_delay_fifo_wr <= phy_delay_fifo_wr + 1'b1;
end
end
genvar i;
generate for (i = 0; i < NUM_LANES; i = i + 1) begin
localparam OFF = MAX_LANE_DELAY - (i + LANE_DELAY);
assign phy_data_in[64*i+63:64*i] =
phy_delay_fifo[(phy_delay_fifo_wr + OFF) % MAX_LANE_DELAY][64*i+63:64*i];
assign phy_header_in[2*i+1:2*i] =
phy_delay_fifo[(phy_delay_fifo_wr + OFF) % MAX_LANE_DELAY][2*i+1+NUM_LANES*64 : 2*i+64*NUM_LANES];
end endgenerate
wire [NUM_LANES-1:0] tx_cfg_lanes_disable;
wire [NUM_LINKS-1:0] tx_cfg_links_disable;
wire [7:0] tx_cfg_beats_per_multiframe;
wire [7:0] tx_cfg_octets_per_frame;
wire [7:0] tx_cfg_lmfc_offset;
wire tx_cfg_sysref_disable;
wire tx_cfg_sysref_oneshot;
wire tx_cfg_continuous_cgs;
wire tx_cfg_continuous_ilas;
wire tx_cfg_skip_ilas;
wire [7:0] tx_cfg_mframes_per_ilas;
wire tx_cfg_disable_char_replacement;
wire tx_cfg_disable_scrambler;
wire tx_ilas_config_rd;
wire [1:0] tx_ilas_config_addr;
wire [32*NUM_LANES-1:0] tx_ilas_config_data;
jesd204_tx_static_config #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS),
.OCTETS_PER_FRAME(OCTETS_PER_FRAME),
.FRAMES_PER_MULTIFRAME(FRAMES_PER_MULTIFRAME),
.SCR(ENABLE_SCRAMBLER),
.LINK_MODE(2)
) i_tx_cfg (
.clk(clk),
.cfg_lanes_disable(tx_cfg_lanes_disable),
.cfg_links_disable(tx_cfg_links_disable),
.cfg_beats_per_multiframe(tx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(tx_cfg_octets_per_frame),
.cfg_lmfc_offset(tx_cfg_lmfc_offset),
.cfg_sysref_disable(tx_cfg_sysref_disable),
.cfg_sysref_oneshot(tx_cfg_sysref_oneshot),
.cfg_continuous_cgs(tx_cfg_continuous_cgs),
.cfg_continuous_ilas(tx_cfg_continuous_ilas),
.cfg_skip_ilas(tx_cfg_skip_ilas),
.cfg_mframes_per_ilas(tx_cfg_mframes_per_ilas),
.cfg_disable_char_replacement(tx_cfg_disable_char_replacement),
.cfg_disable_scrambler(tx_cfg_disable_scrambler),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data)
);
jesd204_tx #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS),
.LINK_MODE(2)
) i_tx (
.clk(clk),
.reset(reset),
.cfg_lanes_disable(tx_cfg_lanes_disable),
.cfg_links_disable(tx_cfg_links_disable),
.cfg_beats_per_multiframe(tx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(tx_cfg_octets_per_frame),
.cfg_lmfc_offset(tx_cfg_lmfc_offset),
.cfg_sysref_disable(tx_cfg_sysref_disable),
.cfg_sysref_oneshot(tx_cfg_sysref_oneshot),
.cfg_continuous_cgs(tx_cfg_continuous_cgs),
.cfg_continuous_ilas(tx_cfg_continuous_ilas),
.cfg_skip_ilas(tx_cfg_skip_ilas),
.cfg_mframes_per_ilas(tx_cfg_mframes_per_ilas),
.cfg_disable_char_replacement(tx_cfg_disable_char_replacement),
.cfg_disable_scrambler(tx_cfg_disable_scrambler),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data),
.ctrl_manual_sync_request(1'b0),
.tx_ready(tx_ready),
.tx_data({NUM_LANES{tx_data}}),
.tx_valid(),
.sync(),
.sysref(sysref_tx),
.phy_data(phy_data_out),
.phy_charisk(),
.phy_header(phy_header_out),
.lmfc_edge(),
.lmfc_clk(),
.event_sysref_edge(),
.event_sysref_alignment_error(),
.status_sync(),
.status_state()
);
wire [NUM_LANES-1:0] rx_cfg_lanes_disable;
wire [NUM_LINKS-1:0] rx_cfg_links_disable;
wire [7:0] rx_cfg_beats_per_multiframe;
wire [7:0] rx_cfg_octets_per_frame;
wire [7:0] rx_cfg_lmfc_offset;
wire rx_sysref_disable;
wire rx_sysref_oneshot;
wire rx_cfg_disable_scrambler;
wire rx_cfg_disable_char_replacement;
wire rx_cfg_buffer_early_release;
wire [7:0] rx_cfg_buffer_delay;
wire [NUM_LANES*3-1:0] status_lane_emb_state;
jesd204_rx_static_config #(
.NUM_LANES(NUM_LANES),
.OCTETS_PER_FRAME(OCTETS_PER_FRAME),
.FRAMES_PER_MULTIFRAME(FRAMES_PER_MULTIFRAME),
.SCR(ENABLE_SCRAMBLER),
.BUFFER_EARLY_RELEASE(BUFFER_EARLY_RELEASE),
.LINK_MODE(2)
) i_rx_cfg (
.clk(clk),
.cfg_lanes_disable(rx_cfg_lanes_disable),
.cfg_links_disable(rx_cfg_links_disable),
.cfg_beats_per_multiframe(rx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(rx_cfg_octets_per_frame),
.cfg_lmfc_offset(rx_cfg_lmfc_offset),
.cfg_sysref_disable(rx_cfg_sysref_disable),
.cfg_sysref_oneshot(rx_cfg_sysref_oneshot),
.cfg_disable_scrambler(rx_cfg_disable_scrambler),
.cfg_disable_char_replacement(rx_cfg_disable_char_replacement),
.cfg_buffer_delay(rx_cfg_buffer_delay),
.cfg_buffer_early_release(rx_cfg_buffer_early_release)
);
jesd204_rx #(
.NUM_LANES(NUM_LANES),
.LINK_MODE(2)
) i_rx (
.clk(clk),
.reset(reset),
.cfg_lanes_disable(rx_cfg_lanes_disable),
.cfg_links_disable(rx_cfg_links_disable),
.cfg_beats_per_multiframe(rx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(rx_cfg_octets_per_frame),
.cfg_lmfc_offset(rx_cfg_lmfc_offset),
.cfg_sysref_disable(rx_cfg_sysref_disable),
.cfg_sysref_oneshot(rx_cfg_sysref_oneshot),
.cfg_disable_scrambler(rx_cfg_disable_scrambler),
.cfg_disable_char_replacement(rx_cfg_disable_char_replacement),
.cfg_buffer_delay(rx_cfg_buffer_delay),
.cfg_buffer_early_release(rx_cfg_buffer_early_release),
.ctrl_err_statistics_reset (1'b0),
.ctrl_err_statistics_mask(7'b0),
.sync(),
.sysref(sysref_rx),
.rx_data(rx_data),
.rx_valid(rx_valid),
.rx_eof(),
.rx_sof(),
.phy_data(phy_data_in),
.phy_charisk({NUM_LANES{4'b0}}),
.phy_notintable({NUM_LANES{4'b0000}}),
.phy_disperr({NUM_LANES{4'b0000}}),
.phy_header(phy_header_in),
.phy_block_sync(phy_block_sync),
.status_lane_ifs_ready(),
.status_lane_latency(),
.status_err_statistics_cnt(),
.lmfc_edge(),
.lmfc_clk(),
.event_sysref_alignment_error(),
.event_sysref_edge(),
.phy_en_char_align(),
.ilas_config_valid(),
.ilas_config_addr(),
.ilas_config_data(),
.status_ctrl_state(),
.status_lane_cgs_state(),
.status_lane_emb_state(status_lane_emb_state)
);
integer ii;
reg rx_status_mismatch = 1'b0;
initial begin
@(posedge rx_valid);
for (ii=0;ii<NUM_LANES;ii=ii+1) begin
#5000;
if (status_lane_emb_state !== {NUM_LANES{3'b100}}) rx_status_mismatch = 1;
phy_block_sync[ii] = 1'b0;
#5000;
phy_block_sync[ii] = 1'b1;
end
#5000;
if (status_lane_emb_state !== {NUM_LANES{3'b100}}) rx_status_mismatch = 1;
end
always @(posedge clk) begin
if (reset == 1'b1) begin
data_mismatch <= 1'b0;
end else if (rx_valid_d1 && rx_valid) begin
if (rx_data !== {NUM_LANES{rx_ref_data}}) begin
data_mismatch <= 1'b1;
end
end
end
always @(*) begin
if (data_mismatch || rx_status_mismatch) begin
failed <= 1'b1;
end else begin
failed <= 1'b0;
end
end
endmodule
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
SOURCE="loopback_tb.v"
SOURCE+=" ../jesd204_common/jesd204_lmfc.v ../jesd204_common/jesd204_scrambler.v ../jesd204_common/jesd204_eof_generator.v"
SOURCE+=" ../jesd204_common/pipeline_stage.v"
SOURCE+=" ../jesd204_rx/jesd204_rx.v ../jesd204_rx/jesd204_rx_lane.v"
SOURCE+=" ../jesd204_rx/jesd204_ilas_monitor.v ../jesd204_rx/align_mux.v ../jesd204_rx/jesd204_rx_cgs.v"
SOURCE+=" ../jesd204_rx/jesd204_rx_ctrl.v ../jesd204_rx/elastic_buffer.v ../jesd204_rx/jesd204_lane_latency_monitor.v"
SOURCE+=" ../jesd204_rx/jesd204_rx_frame_mark.v ../jesd204_rx/jesd204_rx_frame_align_monitor.v"
SOURCE+=" ../jesd204_rx_static_config/jesd204_rx_static_config.v"
SOURCE+=" ../jesd204_tx/jesd204_tx.v ../jesd204_tx/jesd204_tx_ctrl.v ../jesd204_tx/jesd204_tx_lane.v"
SOURCE+=" ../jesd204_tx_static_config/jesd204_tx_static_config.v"
SOURCE+=" ../jesd204_tx_static_config/jesd204_ilas_cfg_static.v"
SOURCE+=" ../../util_cdc/sync_bits.v"
cd `dirname $0`
source run_tb.sh
+327
View File
@@ -0,0 +1,327 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module loopback_tb;
parameter VCD_FILE = "loopback_tb.vcd";
parameter NUM_LANES = 4;
parameter NUM_LINKS = 1;
parameter OCTETS_PER_FRAME = 4;
parameter FRAMES_PER_MULTIFRAME = 16;
parameter ENABLE_SCRAMBLER = 1;
parameter BUFFER_EARLY_RELEASE = 1;
parameter LANE_DELAY = 1;
localparam BEATS_PER_MULTIFRAME = OCTETS_PER_FRAME * FRAMES_PER_MULTIFRAME / 4;
localparam TX_LATENCY = 3;
localparam RX_LATENCY = 3;
localparam BASE_LATENCY = TX_LATENCY + RX_LATENCY;
`include "tb_base.v"
reg [5:0] tx_counter = 'h00;
reg [5:0] rx_counter = 'h00;
reg [NUM_LANES*32-1:0] rx_mask = 'hffff0000;
wire tx_ready;
wire rx_valid;
wire [NUM_LANES*32-1:0] rx_data;
reg data_mismatch = 1'b1;
wire [NUM_LINKS-1:0] sync;
always @(posedge clk) begin
if (sync == 1'b0) begin
tx_counter <= 'h00000000;
end else if (tx_ready == 1'b1) begin
tx_counter <= tx_counter + 1'b1;
end
end
always @(posedge clk) begin
if (sync == 1'b0) begin
rx_counter <= 'h00000000;
if (ENABLE_SCRAMBLER == 1'b1) begin
rx_mask <= {NUM_LANES{32'hffff0000}}; // First two octets are invalid due to scrambling
end else begin
rx_mask <= {NUM_LANES{32'hffffffff}};
end
end else if (rx_valid == 1'b1) begin
rx_counter <= rx_counter + 1'b1;
rx_mask <= {NUM_LANES{32'hffffffff}};
end
end
wire [31:0] tx_data = {tx_counter,2'h3,tx_counter,2'h2,tx_counter,2'h1,tx_counter,2'h0};
wire [31:0] rx_ref_data = {rx_counter,2'h3,rx_counter,2'h2,rx_counter,2'h1,rx_counter,2'h0};
wire [NUM_LANES*32-1:0] phy_data_out;
wire [NUM_LANES*4-1:0] phy_charisk_out;
wire [NUM_LANES*32-1:0] phy_data_in;
wire [NUM_LANES*4-1:0] phy_charisk_in;
reg [5:0] sysref_counter = 'h00;
reg sysref_rx = 1'b0;
reg sysref_tx = 1'b0;
always @(posedge clk) begin
if (sysref_counter == 'h2f)
sysref_rx <= ~sysref_rx;
sysref_counter <= sysref_counter + 1'b1;
sysref_tx <= sysref_rx;
end
localparam MAX_LANE_DELAY = LANE_DELAY + NUM_LANES;
reg [10:0] phy_delay_fifo_wr;
reg [36*NUM_LANES-1:0] phy_delay_fifo[0:MAX_LANE_DELAY-1];
always @(posedge clk) begin
phy_delay_fifo[phy_delay_fifo_wr] <= {phy_charisk_out,phy_data_out};
if (reset == 1'b1 || phy_delay_fifo_wr == MAX_LANE_DELAY-1) begin
phy_delay_fifo_wr <= 'h00;
end else begin
phy_delay_fifo_wr <= phy_delay_fifo_wr + 1'b1;
end
end
genvar i;
generate for (i = 0; i < NUM_LANES; i = i + 1) begin
localparam OFF = MAX_LANE_DELAY - (i + LANE_DELAY);
assign phy_data_in[32*i+31:32*i] =
phy_delay_fifo[(phy_delay_fifo_wr + OFF) % MAX_LANE_DELAY][32*i+31:32*i];
assign phy_charisk_in[4*i+3:4*i] =
phy_delay_fifo[(phy_delay_fifo_wr + OFF) % MAX_LANE_DELAY][4*i+3+NUM_LANES*32:4*i+32*NUM_LANES];
end endgenerate
wire [NUM_LANES-1:0] tx_cfg_lanes_disable;
wire [NUM_LINKS-1:0] tx_cfg_links_disable;
wire [7:0] tx_cfg_beats_per_multiframe;
wire [7:0] tx_cfg_octets_per_frame;
wire [7:0] tx_cfg_lmfc_offset;
wire tx_cfg_sysref_disable;
wire tx_cfg_sysref_oneshot;
wire tx_cfg_continuous_cgs;
wire tx_cfg_continuous_ilas;
wire tx_cfg_skip_ilas;
wire [7:0] tx_cfg_mframes_per_ilas;
wire tx_cfg_disable_char_replacement;
wire tx_cfg_disable_scrambler;
wire tx_ilas_config_rd;
wire [1:0] tx_ilas_config_addr;
wire [32*NUM_LANES-1:0] tx_ilas_config_data;
jesd204_tx_static_config #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS),
.OCTETS_PER_FRAME(OCTETS_PER_FRAME),
.FRAMES_PER_MULTIFRAME(FRAMES_PER_MULTIFRAME),
.SCR(ENABLE_SCRAMBLER)
) i_tx_cfg (
.clk(clk),
.cfg_lanes_disable(tx_cfg_lanes_disable),
.cfg_links_disable(tx_cfg_links_disable),
.cfg_beats_per_multiframe(tx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(tx_cfg_octets_per_frame),
.cfg_lmfc_offset(tx_cfg_lmfc_offset),
.cfg_sysref_disable(tx_cfg_sysref_disable),
.cfg_sysref_oneshot(tx_cfg_sysref_oneshot),
.cfg_continuous_cgs(tx_cfg_continuous_cgs),
.cfg_continuous_ilas(tx_cfg_continuous_ilas),
.cfg_skip_ilas(tx_cfg_skip_ilas),
.cfg_mframes_per_ilas(tx_cfg_mframes_per_ilas),
.cfg_disable_char_replacement(tx_cfg_disable_char_replacement),
.cfg_disable_scrambler(tx_cfg_disable_scrambler),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data)
);
jesd204_tx #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS)
) i_tx (
.clk(clk),
.reset(reset),
.cfg_lanes_disable(tx_cfg_lanes_disable),
.cfg_links_disable(tx_cfg_links_disable),
.cfg_beats_per_multiframe(tx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(tx_cfg_octets_per_frame),
.cfg_lmfc_offset(tx_cfg_lmfc_offset),
.cfg_sysref_disable(tx_cfg_sysref_disable),
.cfg_sysref_oneshot(tx_cfg_sysref_oneshot),
.cfg_continuous_cgs(tx_cfg_continuous_cgs),
.cfg_continuous_ilas(tx_cfg_continuous_ilas),
.cfg_skip_ilas(tx_cfg_skip_ilas),
.cfg_mframes_per_ilas(tx_cfg_mframes_per_ilas),
.cfg_disable_char_replacement(tx_cfg_disable_char_replacement),
.cfg_disable_scrambler(tx_cfg_disable_scrambler),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data),
.ctrl_manual_sync_request(1'b0),
.tx_ready(tx_ready),
.tx_data({NUM_LANES{tx_data}}),
.sync(sync),
.sysref(sysref_tx),
.phy_data(phy_data_out),
.phy_charisk(phy_charisk_out)
);
wire [NUM_LANES-1:0] rx_cfg_lanes_disable;
wire [NUM_LINKS-1:0] rx_cfg_links_disable;
wire [7:0] rx_cfg_beats_per_multiframe;
wire [7:0] rx_cfg_octets_per_frame;
wire [7:0] rx_cfg_lmfc_offset;
wire rx_sysref_disable;
wire rx_sysref_oneshot;
wire rx_cfg_disable_scrambler;
wire rx_cfg_disable_char_replacement;
wire rx_cfg_buffer_early_release;
wire [7:0] rx_cfg_buffer_delay;
wire [NUM_LANES-1:0] rx_status_lane_ifs_ready;
wire [NUM_LANES*14-1:0] rx_status_lane_latency;
wire [NUM_LANES*32-1:0] rx_status_lane_frame_align_err_cnt;
wire [31:0] rx_cfg_frame_align_err_threshold = 32'd4; // TODO: static config
jesd204_rx_static_config #(
.NUM_LANES(NUM_LANES),
.OCTETS_PER_FRAME(OCTETS_PER_FRAME),
.FRAMES_PER_MULTIFRAME(FRAMES_PER_MULTIFRAME),
.SCR(ENABLE_SCRAMBLER),
.BUFFER_EARLY_RELEASE(BUFFER_EARLY_RELEASE)
) i_rx_cfg (
.clk(clk),
.cfg_lanes_disable(rx_cfg_lanes_disable),
.cfg_links_disable(rx_cfg_links_disable),
.cfg_beats_per_multiframe(rx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(rx_cfg_octets_per_frame),
.cfg_lmfc_offset(rx_cfg_lmfc_offset),
.cfg_sysref_disable(rx_cfg_sysref_disable),
.cfg_sysref_oneshot(rx_cfg_sysref_oneshot),
.cfg_disable_scrambler(rx_cfg_disable_scrambler),
.cfg_disable_char_replacement(rx_cfg_disable_char_replacement),
.cfg_buffer_delay(rx_cfg_buffer_delay),
.cfg_buffer_early_release(rx_cfg_buffer_early_release)
);
jesd204_rx #(
.NUM_LANES(NUM_LANES)
) i_rx (
.clk(clk),
.reset(reset),
.cfg_lanes_disable(rx_cfg_lanes_disable),
.cfg_links_disable(rx_cfg_links_disable),
.cfg_beats_per_multiframe(rx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(rx_cfg_octets_per_frame),
.cfg_lmfc_offset(rx_cfg_lmfc_offset),
.cfg_sysref_disable(rx_cfg_sysref_disable),
.cfg_sysref_oneshot(rx_cfg_sysref_oneshot),
.cfg_disable_scrambler(rx_cfg_disable_scrambler),
.cfg_disable_char_replacement(rx_cfg_disable_char_replacement),
.cfg_buffer_delay(rx_cfg_buffer_delay),
.cfg_buffer_early_release(rx_cfg_buffer_early_release),
.cfg_frame_align_err_threshold(rx_cfg_frame_align_err_threshold),
.sync(sync),
.sysref(sysref_rx),
.rx_data(rx_data),
.rx_valid(rx_valid),
.phy_data(phy_data_in),
.phy_charisk(phy_charisk_in),
.phy_notintable({NUM_LANES{4'b0000}}),
.phy_disperr({NUM_LANES{4'b0000}}),
.status_lane_ifs_ready(rx_status_lane_ifs_ready),
.status_lane_latency(rx_status_lane_latency),
.status_lane_frame_align_err_cnt(rx_status_lane_frame_align_err_cnt)
);
always @(posedge clk) begin
if (reset == 1'b1) begin
data_mismatch <= 1'b0;
end else if (rx_valid == 1'b1) begin
if ((rx_data & rx_mask) !== ({NUM_LANES{rx_ref_data}} & rx_mask)) begin
data_mismatch <= 1'b1;
end
end
end
reg [NUM_LANES-1:0] lane_latency_match;
generate for (i = 0; i < NUM_LANES; i = i + 1) begin
localparam LANE_OFFSET = BASE_LATENCY + LANE_DELAY + BEATS_PER_MULTIFRAME + i;
always @(posedge clk) begin
if (rx_status_lane_ifs_ready[i] == 1'b1 &&
rx_status_lane_latency[i*14+13:i*14+2] == LANE_OFFSET) begin
lane_latency_match[i] <= 1'b1;
end else begin
lane_latency_match[i] <= 1'b0;
end
end
end endgenerate
always @(*) begin
if (rx_valid !== 1'b1 || tx_ready !== 1'b1 || data_mismatch == 1'b1 ||
&lane_latency_match != 1'b1) begin
failed <= 1'b1;
end else begin
failed <= 1'b0;
end
end
endmodule
+30
View File
@@ -0,0 +1,30 @@
NAME=`basename $0`
case "$SIMULATOR" in
modelsim)
# ModelSim flow
vlib work
vlog ${SOURCE} || exit 1
vsim ${NAME} -do "add log /* -r; run -a" -gui || exit 1
;;
xcelium)
# Xcelium flow
xmvlog -NOWARN NONPRT ${SOURCE} || exit 1
xmelab -access +rc ${NAME}
xmsim ${NAME} -run -gui || exit 1
;;
xsim)
# xsim flow
xvlog -log ${NAME}_xvlog.log --sourcelibdir . ${SOURCE}
xelab -log ${NAME}_xelab.log -debug all ${NAME}
xsim work.${NAME} -R
;;
*)
mkdir -p run
mkdir -p vcd
iverilog ${SOURCE} -o run/run_${NAME} $1 || exit 1
cd vcd
../run/run_${NAME}
;;
esac
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
SOURCE="rx_cgs_tb.v"
SOURCE+=" ../jesd204_rx/jesd204_rx_cgs.v"
cd `dirname $0`
source run_tb.sh
+95
View File
@@ -0,0 +1,95 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module rx_cgs_tb;
parameter VCD_FILE = "rx_cgs_tb.vcd";
`define TIMEOUT 1000
`include "tb_base.v"
reg [3:0] char_is_error = 4'b0000;
reg [3:0] char_is_cgs = 4'b1111;
integer counter = 'h00;
wire ready;
reg ready_prev = 1'b0;
/*
always @(posedge clk) begin
if ($random % 2 == 0)
char_is_error <= 4'b1111;
else
char_is_error <= 4'b0000;
end
*/
always @(posedge clk) begin
counter <= counter + 1;
if (counter == 'h20) begin
char_is_cgs <= 4'b0001;
end else if (counter > 'h20) begin
char_is_cgs <= 4'b0000;
end
end
jesd204_rx_cgs i_rx_cgs (
.clk(clk),
.reset(reset),
.char_is_cgs(char_is_cgs),
.char_is_error(char_is_error),
.ready(ready)
);
reg lost_sync = 1'b0;
always @(posedge clk) begin
ready_prev <= ready;
if (ready_prev == 1'b1 && ready == 1'b0) begin
lost_sync <= 1'b1;
end
failed <= lost_sync | ~ready;
end
endmodule
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
SOURCE="rx_ctrl_tb.v"
SOURCE+=" ../jesd204_rx/jesd204_rx_ctrl.v"
cd `dirname $0`
source run_tb.sh
+114
View File
@@ -0,0 +1,114 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module rx_ctrl_tb;
parameter VCD_FILE = "rx_ctrl_tb.vcd";
`include "tb_base.v"
integer phy_reset_counter = 'h00;
integer align_counter = 'h00;
integer cgs_counter = 'h00;
reg phy_ready = 1'b0;
reg aligned = 1'b0;
reg cgs_ready = 1'b0;
wire en_align;
wire cgs_reset;
always @(posedge clk) begin
if (reset == 1'b1) begin
phy_reset_counter <= 'h00;
phy_ready <= 1'b0;
end else begin
if (phy_reset_counter == 'h7) begin
phy_ready <= 1'b1;
end else begin
phy_reset_counter <= phy_reset_counter + 1'b1;
end
end
end
always @(posedge clk) begin
if (reset == 1'b1) begin
aligned <= 1'b0;
align_counter <= 'h00;
end else if (phy_ready == 1'b1) begin
if (en_align == 1'b1) begin
if (align_counter == 'h20) begin
aligned <= 1'b1;
end else begin
align_counter <= align_counter + 1;
end
end
end
end
always @(posedge clk or posedge cgs_reset) begin
if (cgs_reset == 1'b1) begin
cgs_counter <= 'h00;
cgs_ready <= 1'b0;
end else begin
if (cgs_counter == 'h20) begin
cgs_ready <= 1'b1;
end else begin
cgs_counter <= cgs_counter + 1;
end
end
end
jesd204_rx_ctrl i_rx_ctrl (
.clk(clk),
.reset(reset),
.phy_ready(phy_ready),
.phy_en_char_align(en_align),
.cgs_reset(cgs_reset),
.cgs_ready(cgs_ready)
);
endmodule
+10
View File
@@ -0,0 +1,10 @@
#!/bin/bash
SOURCE="rx_lane_tb.v "
SOURCE+=" ../jesd204_rx/jesd204_rx_lane.v ../jesd204_rx/jesd204_rx_cgs.v ../jesd204_rx/elastic_buffer.v"
SOURCE+=" ../jesd204_rx/align_mux.v ../jesd204_rx/jesd204_ilas_monitor.v"
SOURCE+=" ../jesd204_common/jesd204_scrambler.v"
SOURCE+=" ../jesd204_common/pipeline_stage.v"
cd `dirname $0`
source run_tb.sh
+148
View File
@@ -0,0 +1,148 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module rx_lane_tb;
parameter VCD_FILE = "rx_lane_tb.vcd";
`include "tb_base.v"
reg [31:0] data = {4{{3'd5,5'd28}}};
reg [3:0] disperr = 4'b0000;
reg [3:0] notintable = 4'b0000;
reg [3:0] charisk = 4'b1111;
wire ilas_config_valid;
wire [1:0] ilas_config_addr;
wire [4*8-1:0] ilas_config_data;
wire [31:0] status_err_statistics_cnt;
wire [4*8-1:0] rx_data;
wire [1:0] status_cgs_state;
wire status_ifs_ready;
wire [1:0] status_frame_align;
integer counter = 'h00;
wire [31:0] counter2 = (counter - 'h20) * 4;
always @(posedge clk) begin
if ($urandom % 400 == 0)
disperr <= 4'b1111;
else if ($urandom % 400 == 1)
disperr <= 4'b0001;
else if ($urandom % 400 == 2)
disperr <= 4'b0011;
else if ($urandom % 400 == 3)
disperr <= 4'b0111;
else
disperr <= 4'b0000;
end
always @(posedge clk) begin
if ($random % 500 == 0)
notintable <= 4'b1111;
else
notintable <= 4'b0000;
end
always @(posedge clk) begin
counter <= counter + 1;
if (counter == 'h20) begin
charisk <= 'h0001;
data[31:8] <= {{24'h020100}};
end else if (counter == 'h21) begin
charisk <= 'h0000;
data[31:0] <= {{32'h06050403}};
end else if (counter > 'h21) begin
data <= (counter2 + 'h2) << 24 |
(counter2 + 'h1) << 16 |
(counter2 + 'h0) << 8 |
(counter2 - 'h1);
charisk <= 4'b0000;
end
end
reg buffer_release_n = 1'b0;
wire buffer_ready_n;
always @(posedge clk) begin
buffer_release_n <= buffer_ready_n;
end
jesd204_rx_lane i_rx_lane (
.clk(clk),
.reset(1'b0),
.phy_data(data),
.phy_charisk(charisk),
.phy_disperr(disperr),
.phy_notintable(notintable),
.cgs_reset(reset),
.cgs_ready(),
.ifs_reset(1'b0),
.rx_data(rx_data),
.buffer_release_n(buffer_release_n),
.buffer_ready_n(buffer_ready_n),
.cfg_disable_scrambler(1'b0),
.ilas_config_valid(ilas_config_valid),
.ilas_config_addr(ilas_config_addr),
.ilas_config_data(ilas_config_data),
.ctrl_err_statistics_reset(1'b0),
.ctrl_err_statistics_mask(3'h7),
.status_err_statistics_cnt(status_err_statistics_cnt),
.status_cgs_state(status_cgs_state),
.status_ifs_ready(status_ifs_ready),
.status_frame_align(status_frame_align)
);
endmodule
+12
View File
@@ -0,0 +1,12 @@
#!/bin/bash
SOURCE="rx_tb.v"
SOURCE+=" ../jesd204_common/jesd204_lmfc.v ../jesd204_common/jesd204_scrambler.v ../jesd204_common/jesd204_eof_generator.v"
SOURCE+=" ../jesd204_common/pipeline_stage.v"
SOURCE+=" ../jesd204_rx_static_config/jesd204_rx_static_config.v "
SOURCE+=" ../jesd204_rx/jesd204_rx.v ../jesd204_rx/jesd204_rx_lane.v ../jesd204_rx/jesd204_lane_latency_monitor.v"
SOURCE+=" ../jesd204_rx/jesd204_ilas_monitor.v ../jesd204_rx/align_mux.v ../jesd204_rx/jesd204_rx_cgs.v"
SOURCE+=" ../jesd204_rx/jesd204_rx_ctrl.v ../jesd204_rx/elastic_buffer.v"
cd `dirname $0`
source run_tb.sh
+215
View File
@@ -0,0 +1,215 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module rx_tb;
parameter VCD_FILE = "rx_tb.vcd";
parameter NUM_LANES = 1;
parameter NUM_LINKS = 1;
parameter OCTETS_PER_FRAME = 8;
parameter FRAMES_PER_MULTIFRAME = 32;
`include "tb_base.v"
integer phy_reset_counter = 'h00;
integer align_counter = 'h00;
reg phy_ready = 1'b0;
reg aligned = 1'b0;
wire en_align;
always @(posedge clk) begin
if (reset == 1'b1) begin
phy_reset_counter <= 'h00;
phy_ready <= 1'b0;
end else begin
if (phy_reset_counter == 'h40) begin
phy_ready <= 1'b1;
end else begin
phy_reset_counter <= phy_reset_counter + 1'b1;
end
end
end
always @(posedge clk) begin
if (reset == 1'b1) begin
aligned <= 1'b0;
align_counter <= 'h00;
end else if (phy_ready == 1'b1) begin
if (en_align == 1'b1) begin
if (align_counter == 'h20) begin
aligned <= 1'b1;
end else begin
align_counter <= align_counter + 1;
end
end
end
end
localparam KCHAR_ILAS_START = {3'd0,5'd28};
localparam KCHAR_LANE_ALIGN = {3'd3,5'd28};
localparam KCHAR_ILAS_CONFIG = {3'd4,5'd28};
localparam KCHAR_CGS = {3'd5,5'd28};
localparam KCHAR_FRAME_ALIGN = {3'd7,5'd28};
reg [31:0] data = KCHAR_CGS;
reg [3:0] charisk = 4'b1111;
reg [3:0] disperr = 4'b0000;
reg [3:0] notintable = 4'b0000;
wire [NUM_LINKS-1:0] sync;
integer counter = 'h00;
wire [31:0] counter2 = (counter - 'h10) * 4;
always @(posedge clk) begin
if ( &sync == 1'b0 ) begin
counter <= 'h00;
charisk <= 4'b1111;
data <= {KCHAR_CGS,KCHAR_CGS,KCHAR_CGS,KCHAR_CGS};
end else begin
counter <= counter + 1;
if (counter >= 'h8 && counter < 'h28) begin
if (counter % 'h8 == 'h0) begin
if (counter != 'h10) begin
data <= {24'h00,KCHAR_ILAS_START};
charisk <= 4'b0001;
end else begin
data <= {16'hffaa,KCHAR_ILAS_CONFIG,KCHAR_ILAS_START};
charisk <= 4'b0011;
end
end else if (counter % 'h8 == 'h7) begin
data <= {KCHAR_LANE_ALIGN,24'h00};
charisk <= 4'b1000;
end else begin
data <= {32'h00};
charisk <= 4'b0000;
end
end else if (counter > 'h10) begin
data <= (counter2 + 'h2) << 24 |
(counter2 + 'h1) << 16 |
(counter2 + 'h0) << 8 |
(counter2 - 'h1);
charisk <= 4'b0000;
end
end
end
wire [NUM_LANES-1:0] cfg_lanes_disable;
wire [NUM_LINKS-1:0] cfg_links_disable;
wire [7:0] cfg_beats_per_multiframe;
wire [7:0] cfg_octets_per_frame;
wire [7:0] cfg_lmfc_offset;
wire cfg_sysref_oneshot;
wire cfg_sysref_disable;
wire cfg_disable_scrambler;
wire cfg_buffer_early_release;
always @(posedge clk) begin
if ($urandom % 400 == 0)
disperr <= 4'b1111;
else if ($urandom % 400 == 1)
disperr <= 4'b0001;
else if ($urandom % 400 == 2)
disperr <= 4'b0011;
else if ($urandom % 400 == 3)
disperr <= 4'b0111;
else
disperr <= 4'b0000;
end
wire [NUM_LANES*32-1:0] status_err_statistics_cnt;
jesd204_rx_static_config #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS),
.OCTETS_PER_FRAME(OCTETS_PER_FRAME),
.FRAMES_PER_MULTIFRAME(FRAMES_PER_MULTIFRAME)
) i_cfg (
.clk(clk),
.cfg_lanes_disable(cfg_lanes_disable),
.cfg_links_disable(cfg_links_disable),
.cfg_beats_per_multiframe(cfg_beats_per_multiframe),
.cfg_octets_per_frame(cfg_octets_per_frame),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_disable(cfg_sysref_disable),
.cfg_disable_scrambler(cfg_disable_scrambler),
.cfg_buffer_early_release(cfg_buffer_early_release)
);
jesd204_rx #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS)
) i_rx (
.clk(clk),
.reset(reset),
.cfg_lanes_disable(cfg_lanes_disable),
.cfg_links_disable(cfg_links_disable),
.cfg_beats_per_multiframe(cfg_beats_per_multiframe),
.cfg_octets_per_frame(cfg_octets_per_frame),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_disable(cfg_sysref_disable),
.cfg_disable_scrambler(cfg_disable_scrambler),
.cfg_buffer_early_release(cfg_buffer_early_release),
.ctrl_err_statistics_reset(1'b0),
.ctrl_err_statistics_mask(3'h7),
.status_err_statistics_cnt(status_err_statistics_cnt),
.phy_en_char_align(en_align),
.phy_data({NUM_LANES{data}}),
.phy_charisk({NUM_LANES{charisk}}),
.phy_notintable({NUM_LANES{notintable}}),
.phy_disperr({NUM_LANES{disperr}}),
.sync(sync),
.sysref(sysref)
);
endmodule
@@ -0,0 +1,994 @@
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
fc37ba9a78bb369f
ffd7bf617e9e3d8f
fe9ebf617fd73fff
f8bbba9a7c373d8f
ef15b1c6744c369f
e322a63d69492c3e
d6b699c25cdd2000
cbb38e3950ea13c1
c3c8856547440960
c028809e41610270
c161809e40280001
c744856543c80270
d0ea8e394bb30960
dcdd99c256b613c1
e949a63d63222000
f44cb1c66f152c3e
@@ -0,0 +1,994 @@
96cbc18568e63566
4c6d1cf69a00af94
0a448663d0845a91
a9572f207cda37bb
ebacc3113e8d8883
31f665c4d936f188
1b3ead1329c629c3
0ada6ea49ed6e821
29109d35ab350970
e4c2a9417c61caaa
719a16af0bd597d1
f8ba807317f5830e
09ee775da15b1f6d
079be433cf00eef9
518d8317792bac32
914f0b44797f8173
32798821daa68fdc
299bf4af7ee5ecdd
c4375a9c7a486f5b
caf588a15b10006c
014ab73763d5b191
c4d1dc21aad2fa46
98371c584dc2c901
5e7e35bc1b479002
310d79e4895b3a7f
41ff416ff8a77293
63e9907e485f7e98
c6dc21f167331c02
94a79aff89c64f91
11b1b61810788558
8ca7f937e48b10b1
9aeac21a1747ea23
67d7af6cf4170787
d84f44f465645341
072c4f25a3a1be40
7f833575160eabfa
f47fff7309953ebc
01574c25617a3c17
f0044ce605233bfa
2e3bd9cbd5dba506
cfeb5c7d27abb70b
cb2bc61ead9186bf
346221c35d4d62ee
5e1a6a8cce858d32
5e6628b785f780c7
31c54785b04bb933
aadbf8273e08f27a
245f81e920c2324b
2ce85811c5f7627b
edd15b73e5161073
6fab4a43dbe07cd0
92b2ef6e27a46c75
8e6a2c307dd0f6c4
02cb1768800f1aa1
8cd075d334933e17
7156f48c6364040b
9bcd72d292ebb803
9dcaededed3f86fd
6aa98113f270e538
4dac25a8adc31428
fb336c9d611b6ce6
315d94e4c97180d5
4e1d540abd4f069b
4ef2056033ea5118
95af2a93a89d3870
b8d72f5ca92a9e4e
70ae388caefdf972
cd0467b8247a69f3
cfcfa5bb86d2dc47
7c5f71c3467892b3
7e4530328c941020
177782be0c63cb3e
774ef1d738c1727e
b67e79139dda709e
7b6d75630d2ef414
dd6f85b52366d84c
f0c62066007f9f7d
3acc63dba65a45f9
d4becc5b2e8b0a8d
4533991ceefed7a2
9c721ca999af2c9e
bbf8c5f939a9fa1b
f075972025255b4d
a2f83ddeac8d1e9c
fdc8d2f7656b0965
6445d151ec3def74
5db99e63938c98b4
4a6227e8e2fbc563
9ffa947025138dcf
d55cb52b8ba3d95e
c3f288351235bbc0
56aee6ad4ca2afa8
30416e9238e368d0
f36ee73adaf4eb82
7ee6a958f27424ad
d49327b790161efb
a2a067e491e0de27
9576895e580848c9
1d25fd9de8934f23
8d79fe851d570691
aadbb02b09432cf5
18453601c6cc8aa5
fdd5a8a28c9534b1
d351a4f72fa2a303
ec80e14fb3ace139
74ec8417c93b8494
d77bf79e200bdbba
229570a137d2c619
26520d5f86d52252
ecca78c05359023a
62d20c29e93623e0
3b8cffffdb49f230
f5c0ca2fd0b52da9
dbdf506911e9f8e8
d9c0732fd3768c4f
d06d998d3c9df548
ff81e7c4c9556e0f
9150e174364e1fa9
534170f4b56d5e2a
da1441ac67aa8e0b
0b69a7c7a068718d
9e9aaf3251cb45f8
01c0df7ac596f6de
459473c298579d06
214ddf02598dda37
90805e474f9f8f28
7e6220f4fcac073e
adacfcf300ec8593
647743f67ecbaa5e
0561db0d61f57809
be829332169831d6
3b5e438774e4f486
27e797554aa5d158
abcb246a6414fded
c91482a4aae164e8
ef57cdde00ceb99e
bf447331520dcf49
780b59f34169d72c
279c2a1b457efa3d
11a8fbbb64fcdcc3
dd9697fef8a41dd9
5f1032e0d8715442
d556d4a7d24cb47c
c6cc295e3c1694a2
e63bdc9b234b7f00
4cfd01f0bd53162e
220d6099703aa7d6
4e6fec72dcab17c4
80dcf5f9dc137734
3c3ee20310928d44
e68c1418d9227f8e
7195e4f43d35e46b
5bb5cf05c7135148
2d4e69ea0464dd19
445a365e6cfbfb5d
6a7ce0f3c54b2ceb
b9d32a36c5909cbb
de0529ed505326d4
8b005320f66cbce4
5d258886052361c7
ac21c17fa4a21269
0375aa0b95975d2a
367616c54900903f
e8c00f13416bb26b
e81facd5f2eb9a5c
54b558d27e78c02b
66bf74d9bcb142af
ff86f2d71ae68a24
993fe110ac4dd6e4
a51351bf8ad58c4b
f809419f65d7091d
fcb349550f5a239d
47ad619aac2fbd93
1944bcb56e15efcf
eb1988bd511ec98b
601d8b0507c44a0f
e424efe88df8ea26
2c6cba315d777cc1
85a3d834a66f414e
fe6d6cca78b2b4e9
f134e89680986c52
9880afe2ff1d2876
0ac073295f13abfb
01804b3d5ba0d268
cc13173065719c1d
afbca11837d26de8
1c8f67b363e66da8
8536a09de9f00510
b71a47ee1d4770a3
ddeff00355aff567
adbdd106ef152b29
be77f22fc080364a
2b342da1d779dad1
7ae92a0613964a34
4a5a178af5bd0fa2
7cb927c35524a75f
567d06fa88521227
92eaa01c2796612b
6df29a0dc70f9970
840a3a7e4ba7646b
28af48986355645b
d0a702e932124b30
386c1bbfa3a61d59
a469234c1bae865f
431e0e94150fabcc
28ed3f3798732b04
8495a5895e70e30a
eb081a53df58c14f
8cf183482a0b90e5
587874ed2741e581
38640218aab29ed5
d7825c7679968c42
f2fa8fe79f91da5c
892760c92153e46c
348f2446f8dc33da
4d1a0fe4eadfeeb2
59e0df258f954d28
f89b6dc0e4486f24
64db65821d9676b2
f2caccf441193b55
9b508ff8ad507478
e23ddba6e61167ff
1250454f31ce562e
d6af56a2788ec6d9
066d132ef29f4c67
32ed44e206a3ef7b
836bc5c527463ff4
af684257464f1020
8a02b490ad0732b4
594c90d4554909b8
149b16c056276eb7
454b58f58e18175e
6f7c948f66060eb2
0a5aa1fdb57d0a00
ae0a001c195a9d4b
7a9a32a2813364cb
22ef4ef79ab4ec54
93a2515b47d453f6
8ef1704f53ba1623
fe26fe3affcfd6c2
1509b72f14fd83eb
e808810487a5c7c6
f718b0341c24f642
51c3fb8af3002aec
9b865d8866ea8862
09e10d930286e716
b153d8c8f8975482
2625baaa48d047c2
0b4993dfecda43a5
a60ecd452d36e732
ca21b9e06f6986a1
88982b88d8119a45
f6db419ccfa327ff
480ba4195591eaea
e0a8abb9fa08e28f
85036679cb84b6ec
5a0731225abb9574
31358e7a29921a2e
4507002440b7b30e
f696d9174e9fd380
75b5c515d8c8b468
be7b6e849f66d17d
78f0dd435709887b
59bbe5f85d984523
48f4d75f7c5d817c
487ee2e4bf1ab116
150e0928adc250f7
d2f14e14de50dd18
548ea413e4b65b5c
c324ed2ad7d89c9a
4c7e75b5890cd318
a852ed0624d27031
f1bb4354345d5afa
32f4de7e8c267b0e
bc1869cf6c5dc5e3
67157731af216fb8
589d31d5c73deb8a
7479b43ca7a52c7a
8837f4b7681747d4
800fa568c598c654
04d4f27f92e51ce5
01aadbe423ae7f36
61392093c019b6b9
a9e09703345f6d34
bf2cfe893e8d14d3
1e063d0346b13acd
57e8ac9d7d526b6c
1c0c1a4bda14d0f2
7dfb1d6a02edeaa5
5e8e30939ed29908
78863b4fdcec78f7
41e0b467ab03c137
49e5a109d1b4b96f
9270919cce3d8748
4aadadfb6bb8bfd6
be9ea9982a1be4c2
4148c8015ea68100
9b3cc36cf87c2a61
d508a60f9be48059
9d36ca780b7b7983
7cc5e86f980feb0e
290e81555c60dcf8
39f21ad7a3f7d35b
0f1cc38c1d5cfc85
3643fcc33e7186b4
e2cf62049ab11fc2
46da5983507172bd
4fe13d50185d50a6
a6e151c625ced4f5
cca456bae41b4851
b3c829efd1f9b2a0
ce8b2eac56b89250
2cd043f352a0148c
190632c4e0dd3ca2
0b858e24341c2afe
692331c6bab9fb89
04d882c7fc5f5345
7e9c8a3cdee1ea3b
0e75c2da85d56c26
f4a685bb6e045777
b634c0480d5b946d
e96614ede222fb6d
7e76c4142af90048
4a33486b504a490d
a4ec3127760ca4f4
8d5bea0e1604b778
a5c33b2d042a6ec0
c9e439a1e241547f
ec7c73123350c71d
f0c9eb3bbf3a476b
86cc3f045ed84bff
7b9af11e0984c84c
1bcece8cb92d8e9a
2d857d563cf0ae01
1dcc3aea75a31152
7b38657d9a843795
dc65f134e9970e95
84e3d2e121df4efa
0680bc4ffb658966
c00e678d6a7c78f0
e7d3a4ca0106a48f
9850855322aebf63
5d71b87019590d38
5f7e08214fb49e39
4babf8adc36df9a3
7acb7ebacd61ede2
048de80ddb366a31
f8e4ef3cef0a47d0
81845b2a23bafc97
f2153a1482930df8
7ca12d021f893525
f0a9cb2fff1a092b
9cc559d0f299e054
64fff63a61a4c6cb
b7097d8f86e49689
228515add5fe95ec
0470293fd87aa4ac
9b0100253ba814a9
6522e8a1cc835917
e80188fc664f6ad5
2e18380e655ba53b
51773aea70a1b360
4ae77c9fafbd1f8b
46a8dd4ab8abb11b
fe2785525d3809f4
ea1fa1e1e41e4009
94cacac05f0a9e90
6ed13ce8b4cc15a3
8c6f043b173f96eb
99a3c02e77c3d158
c82836a539df30c0
bfa9a84e882d5ef0
89e4f67e95934a31
7cad03ab7a1cebd7
92a162cf5c5381be
d5c2b2e90002c6ee
741a260f8084afd1
d23b0486d26591bc
40ad6ff2a6a13caf
0e3e3e4eb73255cf
d3807798131a731a
177f5787b17a3a5a
005d9ba1a13d24d7
88f90be3b6eed434
10668378b0b7e002
1c8d002a46d436b9
8bfa1866bea16ccd
cc2ce4174d5d5734
db3d001c413488c9
0f79d49ba30bfc65
062680d67cbf62df
c67bed67f91d6c15
87bffae430895a94
ec2c25805b64eeb1
c8772caefdef4b4b
801875b7adb3e07b
a8278ab5db8051fe
a51128b05e965f88
f41d8e91ffccd040
f841a41d247280b7
c36844751004dd78
c47da5389faa8945
9261a1af193da4b8
398dafee418408de
41764ce0a257e4f6
646c2d7b0506d84c
0214e2b7adfe0c5a
0941f7cea2d8b953
1b8edb184cc46970
189cc0f881c17646
15fb39a9bb326e96
ed908e2da02186d7
fe0248fbe7b5b16f
b019d0fe71c46a3d
2a7d397140fd7c58
a1123f6ad8ab2197
78772ac8671aab8b
79483688bf4d5e8d
bf448208b0921cf4
3f961974b2662cb2
f27c2e1483b8eb1f
4eb74e6cac9094c0
9b9f0bc4d15e38ae
8d42eb7863dd824b
76cbfcde3d502524
c53619fc4d6936c3
76d4281b9be411ed
42154e5b62e153bc
f2f7d4e181990094
b9b28f040cfb4240
b450b9bef40b383e
b51be00f29122bac
b1e381a07ecb0c2f
cc514fc1824e8552
6b60d7f04fcca3aa
c77dda35d8382c8a
4a58424e6548ade9
f261b858fdf88483
c68056f00de016c3
a32cda13960ac562
3aac08ad1a19209f
3a85973ee8d73f21
1f7ce4a130b538ee
5d70c2a3b095d862
da3003c2a0ea78b0
ce05a13c18ca2501
29b355757b692f80
5afe16c38c480ffa
d1d486c1848277b9
026405483d8c0a74
f54df081f2533043
af4f397d6d0cb316
d78af95c1154efb8
a227444158489d2f
e47430aa39a39507
aa5dcb990ef8d643
73d98e2d640f03c0
67181b67d3e4d3ee
ca69953663e421f8
368a054548046877
e970d91caee0fc49
a22f03b668b34e1f
37fb053f590f78a7
5caec8e55bd16787
084c3da4996b59b9
ae710e53469fa049
c6f9110b4cded6cc
570a401fd1859a1a
03adb3a12ab6e218
51823f14e12cbfe5
a6582d81f42f7fad
76c198bf387b4452
18a04084e63d7407
ea6fd5e8d063cd90
899d38ca7ea45733
339bfaaf8e13f949
78830c8f56275446
f92be81847ef441e
aa9f56a08d373067
3a125f81d50e2eb0
6e745a15407564af
43dade5f2ccbb252
b4d9ba35ef3e1146
a2674e383c5ea2bb
17358c2b1e51fa22
63e413a9ac8e7d30
454847573759ea00
1f5dc024bf0d17b9
48b88ac2ed09bf47
604b2dfc9c455442
283b70ead2416f0b
1b5038f4c70c60c7
fce1a56e0cc9f2b4
23344d0319f2c7e2
1bca2b70f33565b0
cfb12f35fa701dac
6ef68b78a7f8a60d
b8a19ea38a4dec6d
934489a030e6a4e8
6e941a2497ea2fa0
12b7e21bc579b83f
62c9cf1b5c9ca1c9
6bdf4e52c1b3fa59
b1725579b6d55ef8
794e6d12197802c4
bc1a3aba8792969b
b0490ee994813d91
01423880432ce241
9169f94a08324397
092ab360614ab2d4
5a84c344b1aab5f0
f48e1d85ddf273c7
c17523ad903c3bb7
f22422d50fff8987
df20f0ca88e71689
a2fa43ee541e6b60
9ca67822b974ab28
94575b627035591c
3e2303e841663797
bb6090421fb208f0
8aaded54514a47f8
c86a4fa2f3eb396c
9cbcbbab64b32b30
b9cf0c110cd85046
90bb347dfb1d67cd
127fa0d41eb50e75
e73fd1220d3eebbb
5733ac966fa29a4d
097dc692119648cf
8f1e39d3959923ae
9c92fc3843caf8c0
abef24800d77d3ec
054d70c5fa295e1f
2013d958c8209df5
5a73a6cf96dfac84
e0e6aa81d763c053
ecb2fe3723f45107
894beb53a2ecc5f5
3677880616199b3d
51e6b22dbda40040
e3b643f1a8ef7cbe
c985a7f60584268d
5d887bf53001bac0
54a367fbd671e51b
363cbb02c9371fbb
7ef01f4b542f22df
d698360accdeb106
4c4380b045aafb1d
8ef5c6862e741311
4996f337c3a0d43b
e52e3d9eebb3641d
957aa74fbebade15
17623f91d844613a
308ce28d35934488
fa9b00a132601d5f
248c68e8672f4d68
32b5e41d5b9e31c5
508abe502ee56658
5218d0fe424eaed5
a66d3b0f6e517cde
6cdbc71f4ba4a015
fc2a3f54adc57d3f
5fe3e54b775bbe82
91c05ac1ad521d9e
0dd2ab31174bfd2a
ee3fe125fb1408f6
2b1bd0a95d183cb4
776cbc1347a8d85b
2b16cca300bd1b53
4801dccfd93cc4aa
5c0dcf1a5ccd3869
f7e2dc79a1c0ddb5
ca951f4d5b8a474d
f8b442bd3aa8b98b
878f7004f6927561
36ecbc15304692f4
78062e549a769142
5cf3c9c276089b3a
4429db318e15abb8
96bd58558ad9a91a
fadd1951fc48c373
ec057f6389dfeb8a
2959d6f317e467b8
5378d237e0f6338e
6743f85d7d9f4469
a1b6a7eee47864e6
73a98e1595ba63e0
0160713ceffb3a92
e0a239d09b27e0ca
4efcbe821eadc99e
6bf8752ddc169e10
7978ff8973e36620
a59182addab08b2c
cb997ba69aa0d5fb
575c12972620f06f
069f5b4828af18f8
c919335aa58333ab
0bbc6a544aecaf99
a89afd8bfc36e50e
d265a9087954a4d8
5f2e7295b94a4af2
2b5dbfc2e62e1434
916b29f4a5e3d217
73a93a131772d5d8
0d01e1f02c8775c1
6765f785e0dbb9c6
0256d832f159d550
2c8926d4a09a5587
624127be4b73c397
1893b9d39dd4ee8b
7fe267a01b7f508f
4778a9c6bfc4ef0d
adcb471095b76a1a
ab41106b24bb3905
e918dd7d5150465f
5fb759e583e7d55a
f0672f0810c8b8e2
c259dd4ca74098cb
ccf1577d00fbd93d
067ca86c059bb461
8640acf7e5c99939
b8a42bae42df0449
a565dba16f38d0be
c7750038e50cd670
45c3b1a8c09c3b72
d521e380adb1b34c
b51439d78dbdcdc1
15c2b11993c6c8a8
bd157494df1f3f39
9458a1d3c8d042a9
5eac65b112e1c403
2a1e09f1d76c10e7
b29a3d9648bc2d97
41ad93f051622d36
480ebd2b735f5988
956174f1879da2bc
7a3387badfb4c810
3e1a02428e86327b
d37712fe1d9979b1
fd2214b653123b97
cd6aafde883610ac
13f72a453ab6e96e
8b88460608167db1
11d612181922fdef
bb287c9ce81e14e8
0b74a189aba4eece
216a9a7101355023
5b8650dd62aa2849
8de7faca654cfd96
2687a55b2f987902
d47ee35ca4f2b413
66d9b2df5b01b5cc
c9bb342319d6055b
efba21a9819620c8
6d61c818bee1f8eb
b5d25c1c39a38d94
a5ade628228a1ee5
cf702ff3060c7512
c6305eb1de2a1293
107c4733d23a61c5
862b07567a431890
de8ee935cd4c046a
273564bdf30346df
559d8fcc1733a0f4
29fb0d867866eb11
b98022716a23d7eb
41145e901933db0d
a50d432e16dddb9f
de1cf0acc8e2de17
19e96beb554c5561
7c1aec46da5e64e7
57d234bd0f808e7d
67db886279ce0849
c65d35488f1b8425
fa64dfb1f5aef65e
050b0ef0a929bc13
5d0f503313022588
dd49b215ad04ccdc
96233d348c5347c0
02f54d91fd9d36a5
481ec7d07100b4dd
6ce07b4caa1ee46c
62826b87183816af
6e82117511b9ad89
8bc6ae813d54ef3e
34958cf46a9ae6e4
1d5c86ee2530096a
57b64259ce1b25d0
b74506054485de21
2f843b2b0c3dac03
4b210b017146745b
3577f3d59969c4a5
0850998e6fb6b78e
f042b46e8c7a5b5b
22a05ed3dc9fa0ea
ec8c2d8b9b780ede
e28b0b393f1b81ae
1b0f7775ca3c66a9
eb8120da9b8aa15b
9557a37a14e3fbd3
60a099ecde17b5ea
36ded1391248c55f
157a51f767a8aa06
6c86b54fb0459f30
57847eef12eae4e8
cb76dfcb043afbb3
b7883dac116aca09
45fa01f136a74bdd
62738dbb6cc12fbc
1281561e3459d027
732885eb2cde6e48
ff5a602acf2c0ac1
55b0cb641574f1c3
6fabbedf8b093467
963120ef4a2572c4
92f4f1a941185ab7
2edfda7b6863127e
8662dd9ba600586a
7f11e8601f5b302f
d89937a5dfcb2a58
84bbd91e20e1c193
e6fb35cd70a8beac
d81b98bb0b24aa98
8f27d8f686aad41d
da65d768eed6f327
b013cd4786ebd3f9
64eb37803c711ea9
d997a40f26bda900
ad12e159f2ed45e9
3cee02ce39c2b58b
643bb38021211cde
ce8622afb4bb3986
3f805d0062996134
2796f7bf8ddf6296
4a4cdf1f10ff354c
71cba06cf198d79d
42428cae3f934249
3890bccd19b49f09
422be0e20718a30e
b121b6a6a5d4bd4e
fbb8bfb2970f1d3e
73ba4805c3170683
0a019ebbb7999560
142a3bfa4f04204c
28a66f1105847fd4
c02342879875a074
c428cfc3b3a445ce
4d7c38f934ea8992
6c066bc05e52684d
4662d1a24dded482
0cc55b03381fa355
ebfb664afa893077
826526e32e6af7ad
ab59dce2aefe74ed
ef1d7ed81cf83719
88b1f9087382981f
c207f84da0f537ff
e204439dbebecaf0
55782b3c3b547adc
c55ec1c605dd268c
0d0d520e338e99a7
94801086fc657a05
ee346e2e55c6e0c7
119886cabefa02b9
323dc6348cccd5c1
212c91edf2bf2b1b
402b8b13d2f998a6
f19aae07a5330f21
80a841ca6ce0b8e3
4a85022c91ae1ee8
04546d83c3342445
ed4ab7d9384db99b
1e43d25c5a85de9c
d0fa2631e4e16ef7
b255ff62a373208d
b31b98d4aee73863
b90d62992261222b
baafea359fd7c6fb
030da78f44b3acef
1dc80416b3b1a9bf
9e07e661d37e602a
851be1d1c95a3f12
35804e353957cd71
d6bcbb16e0e836c2
6ba6b3e8ddf8ddfd
cc5bba4aeabae439
7f0c5de8a4fc207b
ed893d08b64d310e
8dbd672ef1800692
ca01712b39a29bdf
393abe3fa298b42d
d2c818bd94c1b77b
1f9935c99a8fccac
becbe3c6aa64af29
fc64bd918d970a64
fa1ccae9ed57a2db
958995a0a2eba5cf
e4643a0666e9b9fd
c529dcd30a5725a8
30be034b931e05cb
51ef48d232008c45
2bfa84526561c87c
a65c6d93d985916d
4f7fd0b5c564997d
4ae05b22dc64a01b
0515bb6d53151038
70dd40b2c1e98202
b1f15989164a4e21
b8cc6f1b8d3f30b0
cfb236bb7eb95b9f
59b8590dd7a19e04
b59180d7a06da05c
0a416e36e35495df
3ad9a1f62898c6fd
8ad3c23e96971186
15003844ff587234
20b907e6dd7fdf07
17b7b7cf3ecd8294
8fa7d250e2c4dc18
b7e6a2e1fec6f6e7
c4cb8af301e3111b
2c5ac07832abcec4
09c0f85756ac066d
3db1ebe41833d4a6
72fc076d1ccdf192
ae8bce9d46cb60f7
5bb6b4f51b2b59df
c7b3eb6b34381257
fbf32a77e1db73ab
d44dae7a62bc73d9
3744684656c177fd
816a0ab81de938b4
c3f0da4b70ebec84
9e9bf4c35cd33af0
dc732c38adcd6cf0
92472b93ece18ffc
488d9885bf25dbdc
d0a3d0420ce08d1b
43f8605f7ae8808f
a3cf60e2cc2e9117
e0f6fc5378b88800
50fdebf77e69e802
124eab6ad91a94b2
86306f0162c84e0f
4fbfd05aeca4fc72
9d69da268fcdcd63
c7839c007f4f56a9
3cc40770d71a3180
39e64e6ba5dd8c92
5a9490363cc32188
356a3156581980f0
09ebd9f698edd63e
6959196b38700257
788d0050cec6b251
6dc82891673b3295
b3e6f4018ce244ba
2c125d2810142a31
9f04ec6936de967e
d09e22040d40aa90
efba80c83094d34a
bfa09b34f0639398
46828f7e6ba1e17f
8c9e12615cd26aa7
39e0a5402c5f7b45
113848c0fede81d5
3ba33cfa72c21f09
e01d0038dbfccee7
892048ca4ebfc4fc
2211f27b28622313
8a97e01643aad6ad
666ae1fbc4354805
8e12b25c6f070839
eac400c9eecaa67b
e96e290e15915169
8469e442f01880c9
5fb1a123d5fe5365
6aa234cdf5699d32
f42365227c470807
9ccb48b655489e16
82a5256b2994dc2b
9653d54f51398d4f
fe1b9108be8a48e3
6baeec241cfe539d
5c554ac17bb2704d
693b6bdf09995a72
08727fecfe7145f2
2a76a8720c49a745
9a9029f0f015dd0b
935cce444e8cdb78
941d069c02f4f7e9
fc8ccb8a2980ea88
f74963c130b5328a
91581ab778461290
ffb2a49e73b3c306
00a4ce23ab42817c
b2b8942a7f733dc5
13924ad935ca75d1
a2b59360becd3370
902ef8d32ad7b74a
523c24c55fd79752
fb2821182fc4bb03
02ec75e78b1c25a4
9b1ef06ffa736259
fb6a5b0746676ef6
02ac96ce2903c4ad
fcc43a3a4be2b0ca
8651ce962ae4985c
780eec2440b708b6
8a5be79f00fe9a6c
6fbc9f91a4b1e054
1c840990cff21474
dc4019d9438b8ec5
4bc8c7700b5600dc
e66bc1c50359cc84
ecc17843a7119554
48c78ca2126ae784
8b59422aec786c59
7b33c0f9d0da4c50
d0443b2ae37faadd
a7ea93d00dec4e70
8c09b55dc6d6af49
7253741677a56775
7bfaca3644ea21aa
5213d94c2f4d4f56
ddc9490b3ec04724
a36b4724ba9f1dd6
434e792c40f2e002
57c237126ea1973a
3d192188bf3ddccc
a37aa8503924ea46
82efe740bc8478f1
c55767bfbc0aaf31
d43f45d01ed48d01
57576787cbbad315
355b2592b0924599
908ae61a7ef95f96
c0f2ede2cf0b206b
3296e0ca444724cc
f2f839bdcf68ca2f
05b83e79c558f9cd
5ce4af1c8cafba08
c7761d3279a86c7b
699e927fd77b2a9e
44d7f062b4f51bb0
19dc54a73e5774af
cd2536e0a5524da0
7430a6286cc03fce
a327b505d3d7814d
3cd45117104ec412
e38f62d64a4127f2
a059861b0145793b
c341aa0f4f91e19a
184339d28c95c0f5
7e64d11b9f66e73c
6dc20e4ce6264267
29675f2306a35504
debb0ef5e140372b
8245b87344c143e0
a70d106fbaadeb69
c0ecd9fa2e4d1002
26234296f42a660c
517440b77d2e47ab
cfddcbca64b567fb
9c6c2737a4ff1b26
8ade8cbe0d044b44
33029d8fb543e9b8
30d855f854d7e838
259e77f82cf81ed8
417297f4d258733f
7eb2c3ebb80bb999
b80868f876da7fdf
32df0a7c499b4ba8
8e30291b77e68a70
7da10eac5a91dc72
e01c06970a042dd5
f5c8345b7c56f6d4
2dbc1d0fdec4ed31
84f67bebbd278ca8
16d30f6c6175ba84
93d68f0c2ad731b5
1368d208a03d831f
33cf43b44d3064c4
745f3c1cb0bdb9fa
cd8cda62b3bc4b39
70e779f8c12e20af
03efac484565e759
a8a95cbaad6c8db3
9f25772e7d7c2479
54c6b349ed889332
653346384526a865
ecb14d78c9c07281
011d471524a8890f
845132665608c185
2cac39d0e77c1506
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
SOURCE="scrambler_64b_tb.v"
SOURCE+=" ../jesd204_common/jesd204_scrambler_64b.v"
cd `dirname $0`
source run_tb.sh
+145
View File
@@ -0,0 +1,145 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module scrambler_64b_tb;
parameter VCD_FILE = "scrambler_64b_tb.vcd";
`include "tb_base.v"
reg failed_t1 = 1'b0;
reg failed_t2 = 1'b0;
// Test scrambler against descrambler
//
// Descrambled data should match the input of the scrambler.
reg [63:0] data_in = 'h0;
reg [63:0] data_out_expected;
wire [63:0] data_scrambled;
wire [63:0] data_out;
always @(posedge clk) begin
if (reset == 1'b1) begin
data_in <= 'h0001020304050607;
end else begin
data_in <= data_in + {8{8'h08}};
end
end
jesd204_scrambler_64b #(
.DESCRAMBLE(0)
) i_scrambler (
.clk(clk),
.reset(reset),
.enable(1'b1),
.data_in(data_in),
.data_out(data_scrambled)
);
jesd204_scrambler_64b #(
.DESCRAMBLE(1)
) i_descrambler (
.clk(clk),
.reset(reset),
.enable(1'b1),
.data_in(data_scrambled),
.data_out(data_out)
);
always @(posedge clk) begin
if (data_in != data_out && failed_t1 == 1'b0) begin
failed_t1 <= 1'b1;
end
end
// Test descrambler against reference data
//
// Check if descrambler can synchronize and a stream captured from
// a scrambler output. The descrambled data stream should match the input of
// the scrambler.
reg [63:0] descrambler_data_in = 'h0;
reg [63:0] data_ref = 'h0;
wire[63:0] descrambler_data_out;
integer i;
reg [63:0] scrambler_64b_input [0:993];
reg [63:0] scrambler_64b_output [0:993];
reg t2_enable = 1'b0;
initial begin
$readmemh("scrambler_64b_input.txt", scrambler_64b_input); // Input to a scrambler
$readmemh("scrambler_64b_output.txt", scrambler_64b_output); // Output of a scrambler
@(negedge reset);
@(posedge clk);
for (i=0;i<994;i=i+1) begin
@(posedge clk);
descrambler_data_in <= scrambler_64b_output[i];
data_ref <= scrambler_64b_input[i];
if (i==1) t2_enable <= 1'b1;
if (i==993) t2_enable <= 1'b0;
end
end
jesd204_scrambler_64b #(
.DESCRAMBLE(1)
) i_descrambler2 (
.clk(clk),
.reset(reset),
.enable(1'b1),
.data_in(descrambler_data_in),
.data_out(descrambler_data_out)
);
always @(posedge clk) begin
if (data_ref != descrambler_data_out && failed_t2 == 1'b0 && t2_enable) begin
failed_t2 <= 1'b1;
end
end
always @(posedge clk) begin
failed <= failed_t1 || failed_t2;
end
endmodule
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
SOURCE="scrambler_tb.v"
SOURCE+=" ../jesd204_common/jesd204_scrambler.v"
cd `dirname $0`
source run_tb.sh
+91
View File
@@ -0,0 +1,91 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module scrambler_tb;
parameter VCD_FILE = "scrambler_tb.vcd";
`include "tb_base.v"
reg [31:0] data_in;
reg [31:0] data_out_expected;
wire [31:0] data_scrambled;
wire [31:0] data_out;
always @(posedge clk) begin
if (reset == 1'b1) begin
data_in <= 'h03020100;
end else begin
data_in <= data_in + {4{8'h04}};
end
end
jesd204_scrambler #(
.DESCRAMBLE(0)
) i_scrambler (
.clk(clk),
.reset(reset),
.enable(1'b1),
.data_in(data_in),
.data_out(data_scrambled)
);
jesd204_scrambler #(
.DESCRAMBLE(1)
) i_descrambler (
.clk(clk),
.reset(reset),
.enable(1'b1),
.data_in(data_scrambled),
.data_out(data_out)
);
always @(posedge clk) begin
if (data_in != data_out && failed == 1'b0) begin
failed <= 1'b1;
end
end
endmodule
@@ -0,0 +1,8 @@
#!/bin/bash
SOURCE="soft_pcs_8b10b_sequence_tb.v"
SOURCE+=" ../jesd204_soft_pcs_tx/jesd204_8b10b_encoder.v"
SOURCE+=" ../jesd204_soft_pcs_rx/jesd204_8b10b_decoder.v"
cd `dirname $0`
source run_tb.sh
@@ -0,0 +1,134 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module soft_pcs_8b10b_sequence_tb;
parameter VCD_FILE = "soft_pcs_8b10b_sequence_tb.vcd";
`include "tb_base.v"
// Send a random sequence of characters to the decoder and make sure the
// decoder produces the same character sequence and no disparity or
// not-in-table errors
wire [9:0] raw_data;
reg [7:0] encoder_char = 'h00;
reg encoder_charisk = 1'b0;
wire [7:0] decoder_char;
wire decoder_charisk;
wire decoder_notintable;
wire decoder_disperr;
reg encoder_disparity = 1'b0;
wire encoder_disparity_s;
reg decoder_disparity = 1'b0;
wire decoder_disparity_s;
integer x;
reg inject_enc_disparity_error = 1'b0;
/*
always @(posedge clk) begin
if ({$random} % 256 == 0) begin
inject_enc_disparity_error <= 1'b1;
end else begin
inject_enc_disparity_error <= 1'b0;
end
end
*/
always @(posedge clk) begin
x = {$random} % (256 + 5);
if (x < 256) begin
encoder_char <= x & 8'hff;
encoder_charisk <= 1'b0;
end else begin
case (x - 256)
0: encoder_char <= {3'd0,5'd28};
1: encoder_char <= {3'd3,5'd28};
2: encoder_char <= {3'd4,5'd28};
3: encoder_char <= {3'd5,5'd28};
4: encoder_char <= {3'd7,5'd28};
endcase
encoder_charisk <= 1'b1;
end
encoder_disparity <= encoder_disparity_s ^ inject_enc_disparity_error;
decoder_disparity <= decoder_disparity_s;
end
jesd204_8b10b_encoder i_enc (
.in_char(encoder_char),
.in_charisk(encoder_charisk),
.out_char(raw_data),
.in_disparity(encoder_disparity),
.out_disparity(encoder_disparity_s)
);
jesd204_8b10b_decoder i_dec (
.in_char(raw_data),
.out_char(decoder_char),
.out_notintable(decoder_notintable),
.out_disperr(decoder_disperr),
.out_charisk(decoder_charisk),
.in_disparity(decoder_disparity),
.out_disparity(decoder_disparity_s)
);
wire char_mismatch = encoder_char != decoder_char;
wire charisk_mismatch = encoder_charisk != decoder_charisk;
always @(posedge clk) begin
if (char_mismatch == 1'b1 || charisk_mismatch == 1'b1 ||
decoder_notintable == 1'b1 || decoder_disperr == 1'b1) begin
failed <= 1'b1;
end
end
endmodule
@@ -0,0 +1,8 @@
#!/bin/bash
SOURCE="soft_pcs_8b10b_table_tb.v"
SOURCE+=" ../jesd204_soft_pcs_tx/jesd204_8b10b_encoder.v"
SOURCE+=" ../jesd204_soft_pcs_rx/jesd204_8b10b_decoder.v"
cd `dirname $0`
source run_tb.sh
@@ -0,0 +1,150 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module soft_pcs_8b10b_table_tb;
parameter VCD_FILE = "soft_pcs_8b10b_table_tb.vcd";
`include "tb_base.v"
// Build a table of all valid 8b10b words using the encoder and then check
// for every possible 10-bit value that the decoder correctly reports the
// not-in-table flag
reg [1023:0] valid_table = 'h00;
reg [8:0] counter = 10'h00;
reg [7:0] encoder_char = 8'h00;
reg encoder_charisk = 1'b0;
reg encoder_disparity = 1'b0;
wire [9:0] encoder_raw;
wire [7:0] decoder_char;
wire decoder_notintable;
wire decoder_charisk;
reg [9:0] decoder_raw = 10'h00;
reg build_k28 = 1'b0;
reg build_table = 1'b1;
reg decoder_disparity = 1'b0;
wire decoder_disparity_s;
always @(posedge clk) begin
counter <= counter + 1'b1;
if (counter == 'h1ff) begin
build_k28 <= 1'b1;
end else if (counter == 'h9 && build_k28 == 1'b1) begin
build_table <= 1'b0;
end
end
always @(*) begin
encoder_disparity <= counter[0];
if (build_k28 == 1'b0) begin
encoder_char <= counter[8:1];
encoder_charisk <= 1'b0;
end else begin
case (counter[8:1])
0: encoder_char <= {3'd0,5'd28};
1: encoder_char <= {3'd3,5'd28};
2: encoder_char <= {3'd4,5'd28};
3: encoder_char <= {3'd5,5'd28};
4: encoder_char <= {3'd7,5'd28};
endcase
encoder_charisk <= 1'b1;
end
end
jesd204_8b10b_encoder i_enc (
.in_char(encoder_char),
.in_charisk(encoder_charisk),
.in_disparity(encoder_disparity),
.out_char(encoder_raw)
);
always @(posedge clk) begin
if (build_table == 1'b1) begin
valid_table[encoder_raw] <= 1'b1;
end
end
always @(posedge clk) begin
if (build_table == 1'b0) begin
decoder_disparity <= ~decoder_disparity;
if (decoder_disparity == 1'b1 && decoder_raw != 'h3ff) begin
decoder_raw <= decoder_raw + 1'b1;
end
end
end
always @(posedge clk) begin
end
jesd204_8b10b_decoder i_dec (
.in_char(build_table ? encoder_raw : decoder_raw),
.out_char(decoder_char),
.out_notintable(decoder_notintable),
.out_charisk(decoder_charisk),
.in_disparity(decoder_disparity),
.out_disparity(decoder_disparity_s)
);
wire decoder_should_be_in_table = valid_table[decoder_raw];
always @(posedge clk) begin
if (build_table == 1'b0) begin
if (decoder_notintable == decoder_should_be_in_table) begin
$display("%b.%b, %d", decoder_raw[9:6], decoder_raw[5:0],
decoder_should_be_in_table);
failed <= 1'b1;
end
end
end
endmodule
@@ -0,0 +1,9 @@
#!/bin/bash
SOURCE="soft_pcs_loopback_tb.v"
SOURCE+=" ../jesd204_soft_pcs_tx/jesd204_soft_pcs_tx.v ../jesd204_soft_pcs_tx/jesd204_8b10b_encoder.v"
SOURCE+=" ../jesd204_soft_pcs_rx/jesd204_soft_pcs_rx.v ../jesd204_soft_pcs_rx/jesd204_8b10b_decoder.v"
SOURCE+=" ../jesd204_soft_pcs_rx/jesd204_pattern_align.v"
cd `dirname $0`
source run_tb.sh
@@ -0,0 +1,209 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 pcsTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module soft_pcs_loopback_tb;
parameter VCD_FILE = "soft_pcs_loopback_tb.vcd";
parameter DATA_PATH_WIDTH = 4;
parameter LANE_INVERT = 0;
`include "tb_base.v"
reg [7:0] tx_char = {3'd5,5'd28};
reg tx_charisk = 1'b1;
reg [8*DATA_PATH_WIDTH-1:0] tx_char_pcs = 'h00;
reg [DATA_PATH_WIDTH-1:0] tx_charisk_pcs = 'h00;
wire [7:0] rx_char;
wire rx_charisk;
wire rx_notintable;
wire rx_disperr;
wire [8*DATA_PATH_WIDTH-1:0] rx_char_pcs;
wire [DATA_PATH_WIDTH-1:0] rx_charisk_pcs;
wire [DATA_PATH_WIDTH-1:0] rx_notintable_pcs;
wire [DATA_PATH_WIDTH-1:0] rx_disperr_pcs;
reg rx_pattern_align_en = 1'b1;
wire [10*DATA_PATH_WIDTH-1:0] data_aligned;
wire [10*DATA_PATH_WIDTH+9:0] data_aligned_full;
reg [8:0] data_aligned_d1 = 'h00;
reg [10*DATA_PATH_WIDTH-1:0] data_unaligned = 'h00;
reg [3:0] bitshift = 'h00;
integer clk_div = 0;
wire pcs_clk = clk_div < DATA_PATH_WIDTH / 2 ? 1'b1 : 1'b0;
reg pcs_reset = 1'b1;
always @(posedge pcs_clk) begin
pcs_reset <= 1'b0;
end
always @(posedge clk) begin
if (clk_div == DATA_PATH_WIDTH - 1) begin
clk_div <= 0;
end else begin
clk_div <= clk_div + 1;
end
end
always @(posedge pcs_clk) begin
data_aligned_d1 <= data_aligned[DATA_PATH_WIDTH*10-1:DATA_PATH_WIDTH*10-9];
end
assign data_aligned_full = {data_aligned,data_aligned_d1};
always @(*) begin
data_unaligned <= data_aligned_full[bitshift+:DATA_PATH_WIDTH*10];
end
jesd204_soft_pcs_tx #(
.DATA_PATH_WIDTH(DATA_PATH_WIDTH),
.INVERT_OUTPUTS(LANE_INVERT)
) i_soft_pcs_tx (
.clk(pcs_clk),
.reset(pcs_reset),
.char(tx_char_pcs),
.charisk(tx_charisk_pcs),
.data(data_aligned)
);
jesd204_soft_pcs_rx #(
.DATA_PATH_WIDTH(DATA_PATH_WIDTH),
.INVERT_INPUTS(LANE_INVERT)
) i_soft_pcs_rx (
.clk(pcs_clk),
.reset(pcs_reset),
.patternalign_en(rx_pattern_align_en),
.data(data_unaligned),
.char(rx_char_pcs),
.charisk(rx_charisk_pcs),
.notintable(rx_notintable_pcs),
.disperr(rx_disperr_pcs)
);
always @(posedge clk) begin
tx_char_pcs <= {tx_char,tx_char_pcs[DATA_PATH_WIDTH*8-1:8]};
tx_charisk_pcs <= {tx_charisk,tx_charisk_pcs[DATA_PATH_WIDTH-1:1]};
end
integer rx_mux_select = 0;
always @(posedge clk) begin
if (rx_mux_select == DATA_PATH_WIDTH - 1) begin
rx_mux_select <= 0;
end else begin
rx_mux_select <= rx_mux_select + 1;
end
end
assign rx_charisk = rx_charisk_pcs[rx_mux_select];
assign rx_notintable = rx_notintable_pcs[rx_mux_select];
assign rx_disperr = rx_disperr_pcs[rx_mux_select];
generate
genvar i;
for (i = 0; i < 8; i = i + 1) begin
assign rx_char[i] = rx_char_pcs[rx_mux_select*8+i];
end
endgenerate
integer counter = 0;
localparam STATE_SEND_ALIGN = 0;
localparam STATE_SEND_DATA = 1;
reg state = STATE_SEND_ALIGN;
reg [7:0] rx_compare = 'h00;
always @(posedge clk) begin
case(state)
STATE_SEND_ALIGN: begin
tx_char <= {3'd5,5'd28};
tx_charisk <= 1'b1;
// Worst case alignment time is 40 * DATA_PATH_WIDTH
if (counter < DATA_PATH_WIDTH * 60) begin
rx_pattern_align_en <= 1'b1;
end else begin
rx_pattern_align_en <= 1'b0;
end
if (counter == DATA_PATH_WIDTH * 64) begin
state <= STATE_SEND_DATA;
counter <= 0;
rx_compare <= 'h00;
end else begin
counter <= counter + 1'b1;
end
end
STATE_SEND_DATA: begin
if (tx_charisk == 1'b1) begin
tx_char <= 'h00;
end else begin
tx_char <= tx_char + 1'b1;
end
tx_charisk <= 1'b0;
if (rx_charisk == 1'b0) begin
rx_compare <= rx_compare + 1'b1;
if (rx_char != rx_compare || rx_disperr == 1'b1 || rx_notintable == 1'b1) begin
failed <= 1'b1;
end
end else begin
rx_compare <= 'h00;
end
if (rx_char == 'd255) begin
state <= STATE_SEND_ALIGN;
bitshift <= {$random} % 10;
end
end
endcase
end
endmodule
@@ -0,0 +1,7 @@
#!/bin/bash
SOURCE="soft_pcs_pattern_align_tb.v"
SOURCE+=" ../jesd204_soft_pcs_rx/jesd204_pattern_align.v"
cd `dirname $0`
source run_tb.sh
@@ -0,0 +1,117 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module soft_pcs_pattern_align_tb;
parameter VCD_FILE = "soft_pcs_pattern_align_tb.vcd";
localparam [9:0] PATTERN_P = 10'b1010000011;
localparam [9:0] PATTERN_N = 10'b0101111100;
`define TIMEOUT 1000000
`include "tb_base.v"
integer counter = 0;
reg [3:0] bitshift = 4'd0;
reg [9:0] comma_unaligned;
reg comma_sync = 1'b0;
wire [9:0] comma_aligned;
reg [9:0] comma = PATTERN_P;
wire comma_match = comma == comma_aligned;
always @(posedge clk) begin
if (counter == 63) begin
if (comma_sync != 1'b1) begin
failed <= 1'b1;
end
comma_sync <= 1'b0;
counter <= 0;
bitshift <= {$random} % 10;
comma <= {$random} % 2 ? PATTERN_P : PATTERN_N;
end else begin
counter <= counter + 1'b1;
// Takes two clock cycles for the new value to propagate
if (counter > 1) begin
// Shouldn't loose sync after it gained it
if (comma_match == 1'b1) begin
comma_sync <= 1'b1;
end else if (comma_sync == 1'b1) begin
failed <= 1'b1;
end
end
end
end
always @(*) begin
case (bitshift)
4'd0: comma_unaligned <= comma[9:0];
4'd1: comma_unaligned <= {comma[0],comma[9:1]};
4'd2: comma_unaligned <= {comma[1:0],comma[9:2]};
4'd3: comma_unaligned <= {comma[2:0],comma[9:3]};
4'd4: comma_unaligned <= {comma[3:0],comma[9:4]};
4'd5: comma_unaligned <= {comma[4:0],comma[9:5]};
4'd6: comma_unaligned <= {comma[5:0],comma[9:6]};
4'd7: comma_unaligned <= {comma[6:0],comma[9:7]};
4'd8: comma_unaligned <= {comma[7:0],comma[9:8]};
default: comma_unaligned <= {comma[8:0],comma[9]};
endcase
end
jesd204_pattern_align #(
.DATA_PATH_WIDTH(1)
) i_pa (
.clk(clk),
.reset(1'b0),
.patternalign_en(1'b1),
.in_data(comma_unaligned),
.out_data(comma_aligned)
);
endmodule
+93
View File
@@ -0,0 +1,93 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
reg clk = 1'b0;
reg [3:0] reset_shift = 4'b1111;
reg trigger_reset = 1'b0;
wire reset;
reg failed = 1'b0;
reg sysref = 1'b0;
initial
begin
$dumpfile (VCD_FILE);
$dumpvars;
`ifdef TIMEOUT
#`TIMEOUT
`else
#100000
`endif
if (failed == 1'b0)
$display("SUCCESS");
else
$display("FAILED");
$finish;
end
initial forever #10 clk <= ~clk;
always @(posedge clk) begin
if (trigger_reset == 1'b1) begin
reset_shift <= 3'b111;
end else begin
reset_shift <= {reset_shift[2:0],1'b0};
end
end
assign reset = reset_shift[3];
initial begin
#1000;
@(posedge clk) sysref <= 1'b1;
@(posedge clk) sysref <= 1'b0;
end
task do_trigger_reset;
begin
@(posedge clk) trigger_reset <= 1'b1;
@(posedge clk) trigger_reset <= 1'b0;
end
endtask
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
SOURCE="tx_64b_tb.v"
SOURCE+=" ../jesd204_common/jesd204_lmfc.v ../jesd204_common/jesd204_scrambler_64b.v ../jesd204_common/jesd204_crc12.v"
SOURCE+=" ../jesd204_tx/jesd204_tx.v ../jesd204_tx/jesd204_tx_lane_64b.v ../jesd204_tx/jesd204_tx_header.v"
SOURCE+=" ../jesd204_tx_static_config/jesd204_tx_static_config.v ../jesd204_tx_static_config/jesd204_ilas_cfg_static.v"
SOURCE+=" ../../util_cdc/sync_bits.v"
SOURCE+=" ../jesd204_common/pipeline_stage.v"
cd `dirname $0`
source run_tb.sh
+176
View File
@@ -0,0 +1,176 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module tx_64b_tb;
parameter VCD_FILE = "tx_tb.vcd";
parameter NUM_LANES = 1;
parameter NUM_LINKS = 1;
parameter OCTETS_PER_FRAME = 4;
parameter FRAMES_PER_MULTIFRAME = 32;
`include "tb_base.v"
reg [NUM_LINKS-1:0] sync = {NUM_LINKS{1'b1}};
reg [31:0] counter = 'h00;
reg [63:0] tx_data = 'h00000000;
wire tx_ready;
wire tx_valid = 1'b1;
wire [NUM_LANES-1:0] cfg_lanes_disable;
wire [NUM_LINKS-1:0] cfg_links_disable;
wire [7:0] cfg_beats_per_multiframe;
wire [7:0] cfg_octets_per_frame;
wire [7:0] cfg_lmfc_offset;
wire cfg_sysref_oneshot;
wire cfg_sysref_disable;
wire cfg_continuous_cgs;
wire cfg_continuous_ilas;
wire cfg_skip_ilas;
wire [7:0] cfg_mframes_per_ilas;
wire cfg_disable_char_replacement;
wire cfg_disable_scrambler;
wire tx_ilas_config_rd;
wire [1:0] tx_ilas_config_addr;
wire [32*NUM_LANES-1:0] tx_ilas_config_data;
always @(posedge clk) begin
if (reset == 1'b1) begin
tx_data <= 'h00000000;
end else if (tx_ready == 1'b1) begin
tx_data <= tx_data + 1'b1;
end
end
/* Generate independent SYNCs
*
* Each SYNC will be asserted/deasserted at different clock edges.
* The assertion/deassertion order: first SYNC[0], ..., last SYNC[NUM_LINKS-1]
*/
always @(posedge clk) begin
counter <= counter + 1'b1;
end
genvar i;
generate
for (i=1; i<=NUM_LINKS; i=i+1) begin: SYNC_GENERATOR
always @(posedge clk) begin
if (counter >= (32'h100 | (i << 4)) && counter <= (32'h300 | (i << 4))) begin
sync[i-1] <= 1'b0;
end else begin
sync[i-1] <= 1'b1;
end
end
end
endgenerate
// DUT with static configuration
jesd204_tx_static_config #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS),
.OCTETS_PER_FRAME(OCTETS_PER_FRAME),
.FRAMES_PER_MULTIFRAME(FRAMES_PER_MULTIFRAME)
) i_cfg (
.clk(clk),
.cfg_lanes_disable(cfg_lanes_disable),
.cfg_links_disable(cfg_links_disable),
.cfg_beats_per_multiframe(cfg_beats_per_multiframe),
.cfg_octets_per_frame(cfg_octets_per_frame),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_continuous_cgs(cfg_continuous_cgs),
.cfg_continuous_ilas(cfg_continuous_ilas),
.cfg_skip_ilas(cfg_skip_ilas),
.cfg_mframes_per_ilas(cfg_mframes_per_ilas),
.cfg_disable_char_replacement(cfg_disable_char_replacement),
.cfg_disable_scrambler(cfg_disable_scrambler),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_disable(cfg_sysref_disable),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data)
);
jesd204_tx #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS),
.LINK_MODE(2)
) i_tx (
.clk(clk),
.reset(reset),
.cfg_lanes_disable(cfg_lanes_disable),
.cfg_links_disable(cfg_links_disable),
.cfg_beats_per_multiframe(cfg_beats_per_multiframe),
.cfg_octets_per_frame(cfg_octets_per_frame),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_continuous_cgs(cfg_continuous_cgs),
.cfg_continuous_ilas(cfg_continuous_ilas),
.cfg_skip_ilas(cfg_skip_ilas),
.cfg_mframes_per_ilas(cfg_mframes_per_ilas),
.cfg_disable_char_replacement(cfg_disable_char_replacement),
.cfg_disable_scrambler(cfg_disable_scrambler),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_disable(cfg_sysref_disable),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data),
.ctrl_manual_sync_request (1'b0),
.tx_ready(tx_ready),
.tx_valid(tx_valid),
.tx_data({NUM_LANES{tx_data}}),
.sync(sync),
.sysref(sysref)
);
endmodule
+8
View File
@@ -0,0 +1,8 @@
#!/bin/bash
SOURCE="tx_ctrl_phase_tb.v"
SOURCE+=" ../jesd204_tx/jesd204_tx_ctrl.v"
SOURCE+=" ../../util_cdc/sync_bits.v"
cd `dirname $0`
source run_tb.sh
+212
View File
@@ -0,0 +1,212 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
/*
* Regardless of the phase relationship between LMFC and sync the output of the
* ctrl core should be the same as long as the sync signal is in the same lmfc
* cycle.
*/
`timescale 1ns/100ps
module tx_ctrl_phase_tb;
parameter VCD_FILE = "tx_ctrl_phase.vcd";
parameter NUM_LANES = 1;
parameter BEATS_PER_LMFC = 20;
`include "tb_base.v"
reg lmfc_edge = 1'b0;
reg a_sync = 1'b0;
reg b_sync = 1'b0;
wire [31:0] a_ilas_data;
wire [3:0] a_ilas_charisk;
wire [1:0] a_ilas_config_addr;
wire a_ilas_config_rd;
wire a_tx_ready;
wire a_lane_cgs_enable;
wire [31:0] b_ilas_data;
wire [3:0] b_ilas_charisk;
wire [1:0] b_ilas_config_addr;
wire b_ilas_config_rd;
wire b_tx_ready;
wire b_lane_cgs_enable;
reg reset2 = 1'b1;
integer reset_counter = 0;
integer beat_counter = 0;
integer lmfc_counter = 0;
integer b_offset = 0;
always @(posedge clk) begin
if (reset2 == 1'b1) begin
if (reset_counter == 7) begin
reset2 <= 1'b0;
reset_counter <= 0;
end else begin
reset_counter <= reset_counter + 1;
end
end
if (reset2 == 1'b1) begin
beat_counter <= 0;
a_sync <= 1'b0;
b_sync <= 1'b0;
end else begin
beat_counter <= beat_counter + 1'b1;
if (beat_counter == BEATS_PER_LMFC*2) begin
a_sync <= 1'b1;
end
if (beat_counter == BEATS_PER_LMFC*2 + b_offset) begin
b_sync <= 1'b1;
end
if (beat_counter == BEATS_PER_LMFC*9) begin
b_offset <= b_offset + 1;
reset2 <= 1'b1;
end
end
if (reset2 == 1'b1) begin
lmfc_counter <= BEATS_PER_LMFC-3;
end else begin
lmfc_counter <= lmfc_counter + 1;
if (lmfc_counter == BEATS_PER_LMFC-1) begin
lmfc_counter <= 0;
lmfc_edge <= 1'b1;
end else begin
lmfc_edge <= 1'b0;
end
end
end
jesd204_tx_ctrl i_tx_ctrl_a (
.clk(clk),
.reset(reset2),
.sync(a_sync),
.lmfc_edge(lmfc_edge),
.lane_cgs_enable(a_lane_cgs_enable),
.tx_ready(a_tx_ready),
.ilas_data(a_ilas_data),
.ilas_charisk(a_ilas_charisk),
.ilas_config_addr(a_ilas_config_addr),
.ilas_config_rd(a_ilas_config_rd),
.ilas_config_data('h00),
.ctrl_manual_sync_request(1'b0),
.cfg_continuous_cgs(1'b0),
.cfg_continuous_ilas(1'b0),
.cfg_skip_ilas(1'b0),
.cfg_mframes_per_ilas(8'h3)
);
jesd204_tx_ctrl i_tx_ctrl_b (
.clk(clk),
.reset(reset2),
.sync(b_sync),
.lmfc_edge(lmfc_edge),
.lane_cgs_enable(b_lane_cgs_enable),
.tx_ready(b_tx_ready),
.ilas_data(b_ilas_data),
.ilas_charisk(b_ilas_charisk),
.ilas_config_addr(b_ilas_config_addr),
.ilas_config_rd(b_ilas_config_rd),
.ilas_config_data('h00),
.ctrl_manual_sync_request(1'b0),
.cfg_continuous_cgs(1'b0),
.cfg_continuous_ilas(1'b0),
.cfg_skip_ilas(1'b0),
.cfg_mframes_per_ilas(8'h3)
);
reg status = 1'b1;
always @(*) begin
if (reset2 == 1'b1) begin
status <= 1'b1;
end else if (a_ilas_data != b_ilas_data ||
a_ilas_charisk != b_ilas_charisk ||
a_ilas_config_addr != b_ilas_config_addr ||
a_ilas_config_rd != b_ilas_config_rd ||
a_lane_cgs_enable != b_lane_cgs_enable ||
a_tx_ready != b_tx_ready) begin
status <= 1'b0;
end
end
reg message_shown = 1'b0;
always @(posedge clk) begin
if (status == 1'b0 && message_shown == 1'b0 && b_offset < BEATS_PER_LMFC) begin
$display("FAILED at offset %0d", b_offset);
message_shown <= 1'b1;
end
end
always @(posedge clk) begin
if (b_offset == BEATS_PER_LMFC+1) begin
if (message_shown == 1'b0)
$display("SUCCESS");
$finish;
end
end
endmodule
+10
View File
@@ -0,0 +1,10 @@
#!/bin/bash
SOURCE="tx_tb.v"
SOURCE+=" ../jesd204_common/jesd204_lmfc.v ../jesd204_common/jesd204_scrambler.v ../jesd204_common/jesd204_eof_generator.v"
SOURCE+=" ../jesd204_tx/jesd204_tx.v ../jesd204_tx/jesd204_tx_ctrl.v ../jesd204_tx/jesd204_tx_lane.v"
SOURCE+=" ../jesd204_tx_static_config/jesd204_tx_static_config.v ../jesd204_tx_static_config/jesd204_ilas_cfg_static.v"
SOURCE+=" ../../util_cdc/sync_bits.v"
cd `dirname $0`
source run_tb.sh
+175
View File
@@ -0,0 +1,175 @@
//
// The ADI JESD204 Core is released under the following license, which is
// different than all other HDL cores in this repository.
//
// Please read this, and understand the freedoms and responsibilities you have
// by using this source code/core.
//
// The JESD204 HDL, is copyright © 2016-2017 Analog Devices Inc.
//
// This core is free software, you can use run, copy, study, change, ask
// questions about and improve this core. Distribution of source, or resulting
// binaries (including those inside an FPGA or ASIC) require you to release the
// source of the entire project (excluding the system libraries provide by the
// tools/compiler/FPGA vendor). These are the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// This core 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 version 2
// along with this source code, and binary. If not, see
// <http://www.gnu.org/licenses/>.
//
// Commercial licenses (with commercial support) of this JESD204 core are also
// available under terms different than the General Public License. (e.g. they
// do not require you to accompany any image (FPGA or ASIC) using the JESD204
// core with any corresponding source code.) For these alternate terms you must
// purchase a license from Analog Devices Technology Licensing Office. Users
// interested in such a license should contact [email protected] for
// more information. This commercial license is sub-licensable (if you purchase
// chips from Analog Devices, incorporate them into your PCB level product, and
// purchase a JESD204 license, end users of your product will also have a
// license to use this core in a commercial setting without releasing their
// source code).
//
// In addition, we kindly ask you to acknowledge ADI in any program, application
// or publication in which you use this JESD204 HDL core. (You are not required
// to do so; it is up to your common sense to decide whether you want to comply
// with this request or not.) For general publications, we suggest referencing :
// “The design and implementation of the JESD204 HDL Core used in this project
// is copyright © 2016-2017, Analog Devices, Inc.”
//
`timescale 1ns/100ps
module tx_tb;
parameter VCD_FILE = "tx_tb.vcd";
parameter NUM_LANES = 4;
parameter NUM_LINKS = 2;
parameter OCTETS_PER_FRAME = 4;
parameter FRAMES_PER_MULTIFRAME = 32;
`include "tb_base.v"
reg [NUM_LINKS-1:0] sync = {NUM_LINKS{1'b1}};
reg [31:0] counter = 'h00;
reg [31:0] tx_data = 'h00000000;
wire tx_ready;
wire tx_valid = 1'b1;
wire [NUM_LANES-1:0] cfg_lanes_disable;
wire [NUM_LINKS-1:0] cfg_links_disable;
wire [7:0] cfg_beats_per_multiframe;
wire [7:0] cfg_octets_per_frame;
wire [7:0] cfg_lmfc_offset;
wire cfg_sysref_oneshot;
wire cfg_sysref_disable;
wire cfg_continuous_cgs;
wire cfg_continuous_ilas;
wire cfg_skip_ilas;
wire [7:0] cfg_mframes_per_ilas;
wire cfg_disable_char_replacement;
wire cfg_disable_scrambler;
wire tx_ilas_config_rd;
wire [1:0] tx_ilas_config_addr;
wire [32*NUM_LANES-1:0] tx_ilas_config_data;
always @(posedge clk) begin
if (reset == 1'b1) begin
tx_data <= 'h00000000;
end else if (tx_ready == 1'b1) begin
tx_data <= tx_data + 1'b1;
end
end
/* Generate independent SYNCs
*
* Each SYNC will be asserted/deasserted at different clock edges.
* The assertion/deassertion order: first SYNC[0], ..., last SYNC[NUM_LINKS-1]
*/
always @(posedge clk) begin
counter <= counter + 1'b1;
end
genvar i;
generate
for (i=1; i<=NUM_LINKS; i=i+1) begin: SYNC_GENERATOR
always @(posedge clk) begin
if (counter >= (32'h100 | (i << 4)) && counter <= (32'h300 | (i << 4))) begin
sync[i-1] <= 1'b0;
end else begin
sync[i-1] <= 1'b1;
end
end
end
endgenerate
// DUT with static configuration
jesd204_tx_static_config #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS),
.OCTETS_PER_FRAME(OCTETS_PER_FRAME),
.FRAMES_PER_MULTIFRAME(FRAMES_PER_MULTIFRAME)
) i_cfg (
.clk(clk),
.cfg_lanes_disable(cfg_lanes_disable),
.cfg_links_disable(cfg_links_disable),
.cfg_beats_per_multiframe(cfg_beats_per_multiframe),
.cfg_octets_per_frame(cfg_octets_per_frame),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_continuous_cgs(cfg_continuous_cgs),
.cfg_continuous_ilas(cfg_continuous_ilas),
.cfg_skip_ilas(cfg_skip_ilas),
.cfg_mframes_per_ilas(cfg_mframes_per_ilas),
.cfg_disable_char_replacement(cfg_disable_char_replacement),
.cfg_disable_scrambler(cfg_disable_scrambler),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_disable(cfg_sysref_disable),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data)
);
jesd204_tx #(
.NUM_LANES(NUM_LANES),
.NUM_LINKS(NUM_LINKS)
) i_tx (
.clk(clk),
.reset(reset),
.cfg_lanes_disable(cfg_lanes_disable),
.cfg_links_disable(cfg_links_disable),
.cfg_beats_per_multiframe(cfg_beats_per_multiframe),
.cfg_octets_per_frame(cfg_octets_per_frame),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_continuous_cgs(cfg_continuous_cgs),
.cfg_continuous_ilas(cfg_continuous_ilas),
.cfg_skip_ilas(cfg_skip_ilas),
.cfg_mframes_per_ilas(cfg_mframes_per_ilas),
.cfg_disable_char_replacement(cfg_disable_char_replacement),
.cfg_disable_scrambler(cfg_disable_scrambler),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_disable(cfg_sysref_disable),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
.ilas_config_data(tx_ilas_config_data),
.ctrl_manual_sync_request (1'b0),
.tx_ready(tx_ready),
.tx_valid(tx_valid),
.tx_data({NUM_LANES{tx_data}}),
.sync(sync),
.sysref(sysref)
);
endmodule