Hi Everyone, I have created a source block with two output ports using the rfnocmodtool.
My first question concerns the implementation of the axi_wrappers: I have inserted two axi_wrappers, one for each port (Full code below). Is there any more preferable way to construct the axi_wrapper interface? My second question regards the testbench: In an effort to mimic the noc_block_addsuboot.sv, I have used the tb_streamer.pull_word, and specified in the last argument which port to pull from - '0' for the first port and '1' for the second (Full code below). unfortunately, I received twice the same signal from the first port, and none of the signals from the second. What have I done wrong? Thanks a lot! #################################################### ----------------------1. Code of axi-wrappers:-------------------------------- ##################################################### *//////////////////////////////////////////////////////////// // // RFNoC Shell // //////////////////////////////////////////////////////////// wire [31:0] set_data [0:1]; wire [7:0] set_addr [0:1]; wire set_stb [0:1]; reg [63:0] rb_data [0:1]; // not exist in split stream block wire [7:0] rb_addr [0:1]; // not exist in split stream block wire [63:0] cmdout_tdata, ackin_tdata; wire cmdout_tlast, cmdout_tvalid, cmdout_tready, ackin_tlast, ackin_tvalid, ackin_tready; wire [63:0] str_sink_tdata; wire str_sink_tlast, str_sink_tvalid, str_sink_tready; wire [63:0] str_src_tdata[0:1]; wire [1:0] str_src_tlast, str_src_tvalid, str_src_tready; wire [15:0] resp_out_dst_sid[0:1]; // not exist in split stream block wire [15:0] resp_in_dst_sid; // not exist in split stream block /*wire [31:0] in_tdata; wire [127:0] in_tuser; wire in_tlast, in_tvalid, in_tready; wire [31:0] out_tdata[0:1]; wire [127:0] out_tuser[0:1], out_tuser_pre[0:1]; wire [1:0] out_tlast, out_tvalid, out_tready;*/ wire [1:0] clear_tx_seqnum; wire [15:0] src_sid[0:1], next_dst_sid[0:1];// wire [15:0] src_sid, next_dst_sid; noc_shell #( .NOC_ID(NOC_ID), .STR_SINK_FIFOSIZE(STR_SINK_FIFOSIZE), .OUTPUT_PORTS(2)) noc_shell ( .bus_clk(bus_clk), .bus_rst(bus_rst), .i_tdata(i_tdata), .i_tlast(i_tlast), .i_tvalid(i_tvalid), .i_tready(i_tready), .o_tdata(o_tdata), .o_tlast(o_tlast), .o_tvalid(o_tvalid), .o_tready(o_tready), // Computer Engine Clock Domain .clk(ce_clk), .reset(ce_rst), // Control Sink .set_data({set_data[1],set_data[0]}), .set_addr({set_addr[1],set_addr[0]}), .set_stb({set_stb[1],set_stb[0]}), .rb_stb(2'b1), .rb_data({rb_data[1],rb_data[0]}), .rb_addr({rb_addr[1],rb_addr[0]}), //64'b0 // Control Source .cmdout_tdata(cmdout_tdata), .cmdout_tlast(cmdout_tlast), .cmdout_tvalid(cmdout_tvalid), .cmdout_tready(cmdout_tready), .ackin_tdata(ackin_tdata), .ackin_tlast(ackin_tlast), .ackin_tvalid(ackin_tvalid), .ackin_tready(ackin_tready), // Stream Sink .str_sink_tdata(str_sink_tdata), .str_sink_tlast(str_sink_tlast), .str_sink_tvalid(str_sink_tvalid), .str_sink_tready(str_sink_tready), // Stream Source .str_src_tdata({str_src_tdata[1],str_src_tdata[0]}), .str_src_tlast({str_src_tlast[1],str_src_tlast[0]}), .str_src_tvalid({str_src_tvalid[1],str_src_tvalid[0]}), .str_src_tready({str_src_tready[1],str_src_tready[0]}), // Stream IDs set by host .src_sid({src_sid[1],src_sid[0]}), // SID of this block .next_dst_sid({next_dst_sid[1],next_dst_sid[0]}), // Next destination SID .resp_in_dst_sid(resp_in_dst_sid), // Response destination SID for input stream responses / errors .resp_out_dst_sid({resp_out_dst_sid[1],resp_out_dst_sid[0]}), // Response destination SID for output stream responses / errors // Misc .vita_time('d0), .clear_tx_seqnum({clear_tx_seqnum[1],clear_tx_seqnum[0]}), .debug(debug)); // Null sink //assign str_sink_tready = 1'b1; // Control Source Unused assign cmdout_tdata = 64'd0; assign cmdout_tlast = 1'b0; assign cmdout_tvalid = 1'b0; assign ackin_tready = 1'b1; //////////////////////////////////////////////////////////// // // AXI Wrapper // Convert RFNoC Shell interface into AXI stream interface // //////////////////////////////////////////////////////////// wire [31:0] m_axis_data_tdata; (* dont_touch="true",mark_debug="true"*) wire m_axis_data_tlast; (* dont_touch="true",mark_debug="true"*) wire m_axis_data_tvalid; (* dont_touch="true",mark_debug="true"*) wire m_axis_data_tready; wire [63:0] s_axis_data_tdata; wire [255:0] s_axis_data_tuser; (* dont_touch="true",mark_debug="true"*) wire s_axis_data_tlast; (* dont_touch="true",mark_debug="true"*) wire [1:0] s_axis_data_tvalid; (* dont_touch="true",mark_debug="true"*) wire [1:0] s_axis_data_tready; wire s_axis_data_tvalid_int; wire s_axis_data_tready_int; axi_wrapper #( .SIMPLE_MODE(0), .RESIZE_OUTPUT_PACKET(1)) axi_wrapper ( .clk(ce_clk), .reset(ce_rst), .clear_tx_seqnum(clear_tx_seqnum[0]), .next_dst(next_dst_sid[0]), .set_stb(set_stb[0]), .set_addr(set_addr[0]), .set_data(set_data[0]), .i_tdata(), .i_tlast(), .i_tvalid(), .i_tready(), .o_tdata(str_src_tdata[0]), .o_tlast(str_src_tlast[0]), .o_tvalid(str_src_tvalid[0]), .o_tready(str_src_tready[0]), .m_axis_data_tdata(), // I add it for the input signal .m_axis_data_tlast(), // I add it for the input signal .m_axis_data_tvalid(), // I add it for the input signal .m_axis_data_tready(1'b1), //1'b1 .m_axis_data_tuser(), .s_axis_data_tdata(s_axis_data_tdata[31:0]), // .s_axis_data_tlast(), .s_axis_data_tvalid(s_axis_data_tvalid[0]), .s_axis_data_tready(s_axis_data_tready[0]), .s_axis_data_tuser(s_axis_data_tuser[127:0]), .m_axis_config_tdata(), .m_axis_config_tlast(), .m_axis_config_tvalid(), .m_axis_config_tready(), .m_axis_pkt_len_tdata(), .m_axis_pkt_len_tvalid(), .m_axis_pkt_len_tready()); axi_wrapper #( .SIMPLE_MODE(0), .RESIZE_OUTPUT_PACKET(1)) axi_wrapper_1 ( .clk(ce_clk), .reset(ce_rst), .clear_tx_seqnum(clear_tx_seqnum[1]), .next_dst(next_dst_sid[1]), .set_stb(set_stb[1]), .set_addr(set_addr[1]), .set_data(set_data[1]), //.i_tdata(str_sink_tdata), .i_tlast(str_sink_tlast), .i_tvalid(str_sink_tvalid), .i_tready(str_sink_tready), .i_tdata(), .i_tlast(), .i_tvalid(), .i_tready(), .o_tdata(str_src_tdata[1]), .o_tlast(str_src_tlast[1]), .o_tvalid(str_src_tvalid[1]), .o_tready(str_src_tready[1]), .m_axis_data_tdata(), .m_axis_data_tlast(), .m_axis_data_tvalid(), .m_axis_data_tready(1'b1), .m_axis_data_tuser(), .s_axis_data_tdata(s_axis_data_tdata[63:32]),// .s_axis_data_tlast(), .s_axis_data_tvalid(s_axis_data_tvalid[1]), .s_axis_data_tready(s_axis_data_tready[1]), .s_axis_data_tuser(s_axis_data_tuser[255:128]), .m_axis_config_tdata(), .m_axis_config_tlast(), .m_axis_config_tvalid(), .m_axis_config_tready(), .m_axis_pkt_len_tdata(), .m_axis_pkt_len_tvalid(), .m_axis_pkt_len_tready());* #################################################### ----------------------2. Code of tb_streamer.pull_word--------------------- ##################################################### *module noc_block_TXsource_tb(); `TEST_BENCH_INIT("noc_block_TXsource",`NUM_TEST_CASES,`NS_PER_TICK); localparam BUS_CLK_PERIOD = $ceil(1e9/166.67e6); localparam CE_CLK_PERIOD = $ceil(1e9/200e6); localparam NUM_CE = 1; // Number of Computation Engines / User RFNoC blocks to simulate localparam NUM_STREAMS = 2; // Number of test bench streams (need to be 2 for two ports input or outputs `RFNOC_SIM_INIT(NUM_CE, NUM_STREAMS, BUS_CLK_PERIOD, CE_CLK_PERIOD); `RFNOC_ADD_BLOCK(noc_block_TXsource, 0);* * /******************************************************** ** Test 3 -- Connect RFNoC blocks ********************************************************/ `TEST_CASE_START("Connect RFNoC blocks"); `RFNOC_CONNECT_BLOCK_PORT(noc_block_TXsource,0,noc_block_tb,0,SC16,SPP); `RFNOC_CONNECT_BLOCK_PORT(noc_block_TXsource,1,noc_block_tb,1,SC16,SPP); `TEST_CASE_DONE(1);* * /******************************************************** ** Test 5 -- Test sequence betch0 only ********************************************************/* * fork begin /* `TEST_CASE_START("Start write"); for (int j = 0; j < TEST_LENGTH_1; j++) begin {carry, Sin_skip} = Sin_skip + phase_step_reg; mem_ind = Sin_skip [acclen-1-:accScale]; tb_streamer.push_word(Sin_table[mem_ind],1'b1); end `TEST_CASE_DONE(1); */ end begin // `TEST_CASE_START("Start read 1"); for (int i = 0; i < TEST_LENGTH_1; ++i) begin tb_streamer.pull_word({recv_value_image_out_1,recv_value_real_out_1},last_out_1,0); tb_streamer.pull_word({recv_value_image_out_2,recv_value_real_out_2},last_out_2,1); expected_value_out_1 = 5; expected_value_out_2 = 5; $sformat(s_1, "The real output value is: %0d, and image is: %0d, i is: %0d", recv_value_real_out_1, recv_value_image_out_1,i); // $sformat(s, "Incorrect value received! Expected: %0d, Received: %0d, i is: %0d", expected_value, {recv_value_image,recv_value_real},i); `ASSERT_ERROR({recv_value_real_out_1, recv_value_image_out_1} == expected_value_out_1, s_2); $sformat(s_2, "The real output value is: %0d, and image is: %0d, i is: %0d", recv_value_real_out_2, recv_value_image_out_2,i); // $sformat(s, "Incorrect value received! Expected: %0d, Received: %0d, i is: %0d", expected_value, {recv_value_image,recv_value_real},i); `ASSERT_ERROR({recv_value_real_out_2, recv_value_image_out_2} == expected_value_out_2, s_2); end end join //`TEST_CASE_DONE(1); `TEST_BENCH_DONE; *
_______________________________________________ USRP-users mailing list USRP-users@lists.ettus.com http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com