tb_const_enc.v
上传用户:jin985143
上传日期:2020-09-30
资源大小:278k
文件大小:8k
源码类别:

Modem编程

开发平台:

VHDL

  1. /* *****************************************************************
  2.  *
  3.  *  This file is part of the
  4.  *
  5.  *   Tone Order and Constellation Encoder Core.
  6.  *  
  7.  *  Copyright (C) 2007 Guenter Dannoritzer
  8.  *
  9.  *   This source is free software; you can redistribute it
  10.  *   and/or modify it under the terms of the 
  11.  *             GNU General Public License
  12.  *   as published by the Free Software Foundation; 
  13.  *   either version 3 of the License,
  14.  *   or (at your option) any later version.
  15.  *
  16.  *   This source is distributed in the hope 
  17.  *   that it will be useful, but WITHOUT ANY WARRANTY;
  18.  *   without even the implied warranty of MERCHANTABILITY
  19.  *   or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  *   GNU General Public License for more details.
  21.  *
  22.  *   You should have received a copy of the
  23.  *   GNU General Public License along with this source.
  24.  *   If not, see <http://www.gnu.org/licenses/>.
  25.  *
  26.  * *****************************************************************/
  27. module tb_const_encoder();
  28. parameter TW              = 10;
  29. `include "parameters.vh"
  30. reg                 clk;
  31. reg                 reset;
  32. wire                fast_ready_o;
  33. reg                 we_fast_data_i;
  34. reg   [DW-1:0]      fast_data_i;
  35. wire                inter_ready_o;
  36. reg                 we_inter_data_i;
  37. reg   [DW-1:0]      inter_data_i;
  38. reg                 we_conf_i;
  39. reg   [CONFAW-1:0]  addr_i;
  40. reg   [CONFDW-1:0]  conf_data_i;
  41. wire  [CNUMW-1:0]   carrier_num_o;
  42. wire  signed [CONSTW-1:0]  x_o;
  43. wire  signed [CONSTW-1:0]  y_o;
  44. //
  45. // instantiate the DUT
  46. // 
  47. const_encoder dut ( .clk(clk),
  48.                     .reset(reset),
  49.                     .fast_ready_o(fast_ready_o),
  50.                     .we_fast_data_i(we_fast_data_i),
  51.                     .fast_data_i(fast_data_i),
  52.                     .inter_ready_o(inter_ready_o),
  53.                     .we_inter_data_i(we_inter_data_i),
  54.                     .inter_data_i(inter_data_i),
  55.                     .addr_i(addr_i),
  56.                     .we_conf_i(we_conf_i),
  57.                     .conf_data_i(conf_data_i),
  58.                     .xy_ready_o(xy_ready_o),
  59.                     .carrier_num_o(carrier_num_o),
  60.                     .x_o(x_o),
  61.                     .y_o(y_o));
  62. //
  63. // instantiate test data modules
  64. //
  65. const_map_2bit cm_2bit();
  66. const_map_3bit cm_3bit();
  67. const_map_4bit cm_4bit();
  68. const_map_5bit cm_5bit();
  69. initial begin
  70.   clk = 0;
  71.   we_fast_data_i = 0;
  72.   we_inter_data_i = 0;
  73.   we_conf_i = 0;
  74.   reset = 0;
  75. end
  76. always begin
  77.   #TW clk = ~clk;
  78. end
  79. //
  80. // dump signals
  81. //
  82. initial begin
  83.   $dumpfile("tb_const_enc.vcd");
  84.   $dumpvars;
  85. end
  86. //
  87. // main test
  88. // 
  89.                   
  90. initial begin
  91.   $monitor($time, " reset: ", reset);
  92.   
  93.   apply_reset;
  94.   //
  95.   // write configuration
  96.   //
  97.   write_config(BIT_LOAD_ST_ADR, 2);
  98.   write_config(BIT_LOAD_ST_ADR+1, 3);
  99.   write_config(BIT_LOAD_ST_ADR+2, 4);
  100.   write_config(BIT_LOAD_ST_ADR+3, 5);
  101.   write_config(C_NUM_ST_ADR,    48);
  102.   write_config(C_NUM_ST_ADR+1,  49);
  103.   write_config(C_NUM_ST_ADR+2,  50);
  104.   write_config(C_NUM_ST_ADR+3,  51);
  105.   
  106.   
  107.   write_config(USED_C_ADR, 4);
  108.   write_config(F_BITS_ADR, 7);
  109.   
  110.   //
  111.   // check written configuration
  112.   //
  113.   check_config(BIT_LOAD_ST_ADR,   2);
  114.   check_config(BIT_LOAD_ST_ADR+1, 3);
  115.   check_config(BIT_LOAD_ST_ADR+2, 4);
  116.   check_config(BIT_LOAD_ST_ADR+3, 5);
  117.   check_config(C_NUM_ST_ADR,    48);
  118.   check_config(C_NUM_ST_ADR+1,  49);
  119.   check_config(C_NUM_ST_ADR+2,  50);
  120.   check_config(C_NUM_ST_ADR+3,  51);
  121.   check_config(USED_C_ADR, 4);
  122.   check_config(F_BITS_ADR, 7);
  123.   //
  124.   // checking the constellation map
  125.   //
  126.   check_const_map(2);
  127.   check_const_map(3);
  128.   check_const_map(4);
  129.   check_const_map(5);
  130.   
  131.   #1000 $finish();
  132. end // main test
  133. // //////////////////////////////////////////////////////////////////// 
  134. // 
  135. // bus functional models
  136. // 
  137. // //////////////////////////////////////////////////////////////////// 
  138. task apply_reset;
  139.   begin
  140.     reset = 0;
  141.     #20
  142.     reset = 1;
  143.     @(posedge clk);
  144.     reset = 0;
  145.   end
  146. endtask
  147.   
  148. //
  149. // write data to the configuration registers
  150. //
  151. task write_config(input [CONFAW-1:0] addr, input[CONFDW-1:0] data);
  152.   begin
  153.     
  154.     addr_i = addr;
  155.     conf_data_i = data;
  156.     @(negedge clk);
  157.     we_conf_i = 1;
  158.     @(negedge clk);
  159.     we_conf_i = 0;
  160.     
  161.   end
  162. endtask
  163. //
  164. // check the written configuration
  165. //
  166. task check_config(input [CONFAW-1:0] addr, input [CONFDW-1:0] exp_data);
  167.   begin
  168.     if(addr >= 0 && addr < C_NUM_ST_ADR) begin
  169.     
  170.       if(dut.BitLoading[addr] !== exp_data) begin
  171.         $display("ERROR! => BitLoading does not match @ %x!", addr);  
  172.         $display("          Got: %d expected: %d", 
  173.                   dut.BitLoading[addr], exp_data);
  174.       end
  175.       
  176.     end
  177.     else if(addr >= C_NUM_ST_ADR && addr < USED_C_ADR) begin
  178.       if(dut.CarrierNumber[addr-C_NUM_ST_ADR] !== exp_data) begin
  179.         $display("ERROR! => CarrierNumber does not match @ %x!", addr);  
  180.         $display("          Got: %d expected: %d", 
  181.                   dut.CarrierNumber[addr-C_NUM_ST_ADR], exp_data);
  182.       end
  183.       
  184.     end
  185.     else if(addr == USED_C_ADR) begin
  186.       
  187.       if(dut.UsedCarrier !== exp_data) begin
  188.         $display("ERROR! => UsedCarrier does not match @ %x!", addr);  
  189.         $display("          Got: %d expected: %d", 
  190.                   dut.UsedCarrier, exp_data);
  191.       end
  192.     
  193.     end
  194.     else if(addr == F_BITS_ADR) begin
  195.       
  196.       if(dut.FastBits !== exp_data) begin
  197.         $display("ERROR! => FastBits does not match @ %x!", addr);  
  198.         $display("          Got: %d expected: %d", 
  199.                   dut.FastBits, exp_data);
  200.       end
  201.     end
  202.   end
  203. endtask
  204. //
  205. // check constellation map
  206. //
  207. // This task feeds in data direct to the constellation encoder module
  208. // and checks the expected outcome.
  209. //
  210. // Given parameter is the bit size of the constellation map.
  211. //
  212. task check_const_map(input [3:0] bit);
  213.   integer len;
  214.   integer i;
  215.   begin
  216.    len = 1 << bit;
  217.     for(i=0; i<len; i=i+1) begin
  218.       $display("Testing %d bit constellation with input value %d", bit, i);
  219.       // feed input data
  220.       dut.bit_load <= bit;
  221.       dut.cin <= i;
  222.       @ (posedge clk);
  223.       @ (posedge clk);
  224.       @ (negedge clk);
  225.       // compare output with expected result
  226.       case (bit)
  227.         1:  $display("%d bit is not support constellation size", bit);
  228.         2:  begin
  229.               if(cm_2bit.re[i] !== x_o) begin
  230.                 $display("Input: %d --> x_o expected: %d got: %d", i, cm_2bit.re[i], x_o);
  231.               end
  232.               if(cm_2bit.im[i] !== y_o) begin
  233.                 $display("Input: %d --> y_o expected: %d got: %d", i, cm_2bit.im[i], y_o);
  234.               end
  235.             end
  236.         
  237.         3:  begin
  238.               if(cm_3bit.re[i] !== x_o) begin
  239.                 $display("Input: %d --> x_o expected: %d got: %d", i, cm_3bit.re[i], x_o);
  240.               end
  241.               if(cm_3bit.im[i] !== y_o) begin
  242.                 $display("Input: %d --> y_o expected: %d got: %d", i, cm_3bit.im[i], y_o);
  243.               end
  244.             end
  245.         
  246.         4:  begin
  247.               if(cm_4bit.re[i] !== x_o) begin
  248.                 $display("Input: %d --> x_o expected: %d got: %d", i, cm_4bit.re[i], x_o);
  249.               end
  250.               if(cm_4bit.im[i] !== y_o) begin
  251.                 $display("Input: %d --> y_o expected: %d got: %d", i, cm_4bit.im[i], y_o);
  252.               end
  253.             end
  254.         
  255.         5:  begin
  256.               if(cm_5bit.re[i] !== x_o) begin
  257.                 $display($time, " Input: %d --> x_o expected: %d got: %d", i, cm_5bit.re[i], x_o);
  258.               end
  259.               if(cm_5bit.im[i] !== y_o) begin
  260.                 $display($time, " Input: %d --> y_o expected: %d got: %d", i, cm_5bit.im[i], y_o);
  261.               end
  262.             end
  263.         default: $display("%d is not an implemented bit size", bit);
  264.       endcase
  265.         
  266.     end
  267.   end
  268. endtask
  269. endmodule