首页->【亚军:Vivado入门与提高】

18 1

请问rtl代码仿真时没有问题,将之综合成网表后对网表进行仿真,仿真波形不一样了呢,并且综合时并没有报warning,请问这是什么原因呢,以下是我的代码和testbench,是发送一帧mac数据的程序


module mac_transmite(
                     i_reset_n,
       i_tx_clk,
       o_tx_data,
       o_tx_en
                     );

input                          i_reset_n;     // Sync reset.
input                          i_tx_clk;
output [3:0]                   o_tx_data;
output                         o_tx_en;

reg o_tx_en;
wire w_tx_en;
reg [10:0]count;
wire [10:0]w_count;
reg byte_1;
wire w_byte;
reg [3:0]tx_data;
wire [3:0]w_tx_data;
wire [7:0]data_c;
(*keep="ture"*) reg [543:0]memory_data;
wire [543:0]w_memory_data;
reg crc_en;
wire w_crc_en;
wire [3:0]o_tx_data;
wire [31:0]crc;

mac_t_crc u1(
.clk_crc_i(i_tx_clk),
.rst_clk_crc_n(i_reset_n),
.data(data_c),
.data_valid(crc_en),
.crc(crc)
);
assign o_tx_data=(count<=135)?tx_data:(count==136)?crc[3:0]:
 (count==137)?crc[7:4]:(count==138)?crc[11:8]:
 (count==139)?crc[15:12]:(count==140)?crc[19:16]:
 (count==141)?crc[23:20]:(count==142)?crc[27:24]:
 (count==143)?crc[31:28]:4'b0000;

always @(posedge i_tx_clk or negedge i_reset_n)begin
 if(!i_reset_n)begin
  o_tx_en<=0;
 end
 else begin
  o_tx_en<=w_tx_en;
 end
 
end
assign w_tx_en=(count<143)?1'b1:1'b0;
always @(posedge i_tx_clk or negedge i_reset_n)begin
 if(!i_reset_n)begin
  count<=0;
 end
 else begin
  count<=w_count;
 end
end
assign w_count=(i_reset_n==1'b1)?count+11'd1:count;

always @(posedge i_tx_clk or negedge i_reset_n)begin
 if(!i_reset_n)begin
  byte_1<=0;
 end
 else begin
  byte_1<=w_byte;
 end
end
assign w_byte=(count%2==0)?1'b1:1'b0;
always @(posedge i_tx_clk or negedge i_reset_n)begin
 if(!i_reset_n)begin
  tx_data<=0;
 end
 else begin
  tx_data<=w_tx_data;
 end
end  
assign w_tx_data=(byte_1==0 && i_reset_n==1)?data_c[3:0]:(byte_1==1 && i_reset_n==1)?data_c[7:4]:tx_data;

assign data_c=memory_data[543:536];

always @(posedge i_tx_clk or negedge i_reset_n)begin
 if(!i_reset_n)begin
  memory_data<=544'h55555555555555d5ffffffffffff3C46d8914c578899230000007a94ec080817000000000000000000000000000000000000000000000000000000000000000000000000;
 end
 else begin
  memory_data<=w_memory_data;
 end
end
assign w_memory_data=(count<=135 && count%2!=0)?memory_data<<8:memory_data;

always @(posedge i_tx_clk or negedge i_reset_n)begin
 if(!i_reset_n)begin
  crc_en<=0;
 end
 else begin
  crc_en<=w_crc_en;
 end
end
assign w_crc_en=((count%2==0) && (count>=11'd15) && (count<=11'd135))?1'b1:1'b0;


endmodule



module mac_t_crc (
         clk_crc_i,
                     rst_clk_crc_n,
                     data,
                     data_valid,
                    // reset_crc,
                     //crc_match,
                     crc
                     );

  input                          clk_crc_i;         // 2.5/25/125 MHz Rx clock.
  input                          rst_clk_crc_n;     // Sync reset.
  input [7:0]                    data;              // Data for crc computation.
  input                          data_valid;        // Data enable.
  output [31:0]                  crc;               // Output of CRC reg.

  reg  [31:0]  crc_reg;                             // Stores the partially computed CRC.
  wire [31:0]  next_crc;                            // Combinatorial next CRC generation        
  wire [7:0] data; 

  // Register tp store the current calculated next CRC.
     always @(posedge clk_crc_i or negedge rst_clk_crc_n) begin
    if (!rst_clk_crc_n) begin
      crc_reg <= 32'hFFFFFFFF;
    end
      else if (data_valid) begin
        crc_reg <= next_crc;
      end
  end

// Combinatorial next CRC generation

  assign next_crc[0]  = crc_reg[30] ^ data[1] ^ crc_reg[24] ^ data[7];

  assign next_crc[1]  = data[6] ^ data[7] ^ data[0] ^ crc_reg[30] ^
                        crc_reg[31] ^ data[1] ^ crc_reg[24] ^ crc_reg[25];

  assign next_crc[2]  = crc_reg[26] ^ data[5] ^ data[6] ^ data[7] ^
                        crc_reg[30] ^ data[0] ^ data[1] ^ crc_reg[31] ^
                        crc_reg[24] ^ crc_reg[25];

  assign next_crc[3]  = data[4] ^ crc_reg[26] ^ data[5] ^ crc_reg[27] ^
                        data[6] ^ data[0] ^ crc_reg[31] ^ crc_reg[25];

  assign next_crc[4]  = data[4] ^ crc_reg[26] ^ data[5] ^ crc_reg[27] ^
                        crc_reg[28] ^ data[7] ^ crc_reg[30] ^ data[1] ^
                        crc_reg[24] ^ data[3];

  assign next_crc[5]  = data[4] ^ crc_reg[27] ^ data[6] ^ crc_reg[28] ^
                        data[7] ^ crc_reg[29] ^ crc_reg[30] ^ data[0] ^ data[1] ^
                        crc_reg[31] ^ data[2] ^ crc_reg[24] ^ data[3] ^
                        crc_reg[25];

  assign next_crc[6]  = crc_reg[26] ^ data[5] ^ data[6] ^ crc_reg[28] ^
                        crc_reg[29] ^ data[0] ^ crc_reg[30] ^ crc_reg[31] ^
                        data[1] ^ data[2] ^ data[3] ^ crc_reg[25];

  assign next_crc[7]  = data[4] ^ crc_reg[26] ^ data[5] ^ crc_reg[27] ^
                        data[7] ^ crc_reg[29] ^ data[0] ^ crc_reg[31] ^
                        data[2] ^ crc_reg[24];

  assign next_crc[8]  = data[4] ^ crc_reg[27] ^ data[6] ^ crc_reg[28] ^
                        data[7] ^ crc_reg[24] ^ crc_reg[0]  ^ data[3] ^
                        crc_reg[25];

  assign next_crc[9]  = crc_reg[26] ^ data[5] ^ data[6] ^ crc_reg[28] ^
                        crc_reg[29] ^ data[2] ^ data[3] ^ crc_reg[25] ^
                        crc_reg[1];

  assign next_crc[10] = data[4] ^ crc_reg[26] ^ crc_reg[2]  ^ data[5] ^
                        crc_reg[27] ^ data[7] ^ crc_reg[29] ^ data[2] ^
                        crc_reg[24];

  assign next_crc[11] = data[4] ^ crc_reg[27] ^ data[6] ^ crc_reg[3] ^
                        crc_reg[28] ^ data[7] ^ crc_reg[24] ^ data[3] ^
                        crc_reg[25];

  assign next_crc[12] = crc_reg[26] ^ data[5] ^ data[6] ^ crc_reg[28] ^
                        data[7] ^ crc_reg[4]  ^ crc_reg[29] ^ crc_reg[30] ^
                        data[1] ^ data[2] ^ crc_reg[24] ^ data[3] ^
                        crc_reg[25];

  assign next_crc[13] = data[4] ^ crc_reg[26] ^ data[5] ^ crc_reg[27] ^
                        data[6] ^ crc_reg[29] ^ data[0] ^ crc_reg[30] ^
                        crc_reg[5]  ^ crc_reg[31] ^ data[1] ^ data[2] ^
                        crc_reg[25];

  assign next_crc[14] = data[4] ^ crc_reg[26] ^ data[5] ^ crc_reg[27] ^
                        crc_reg[28] ^ crc_reg[30] ^ data[0] ^ data[1] ^
                        crc_reg[31] ^ crc_reg[6]  ^ data[3];

  assign next_crc[15] = data[4] ^ crc_reg[27] ^ crc_reg[28] ^ crc_reg[29] ^
                        data[0] ^ crc_reg[31] ^ data[2] ^ crc_reg[7] ^
                        data[3];

  assign next_crc[16] = crc_reg[28] ^ data[7] ^ crc_reg[29] ^ data[2] ^
                        crc_reg[24] ^ data[3] ^ crc_reg[8];

  assign next_crc[17] = crc_reg[9]  ^ data[6] ^ crc_reg[29] ^ crc_reg[30] ^
                        data[1] ^ data[2] ^ crc_reg[25];

  assign next_crc[18] = crc_reg[26] ^ data[5] ^ crc_reg[10] ^ crc_reg[30] ^
                        data[0] ^ data[1] ^ crc_reg[31];

  assign next_crc[19] = data[4] ^ crc_reg[27] ^ crc_reg[11] ^ data[0] ^
                        crc_reg[31];

  assign next_crc[20] = crc_reg[28] ^ crc_reg[12] ^ data[3];

  assign next_crc[21] = crc_reg[29] ^ crc_reg[13] ^ data[2];

  assign next_crc[22] = data[7] ^ crc_reg[14] ^ crc_reg[24];

  assign next_crc[23] = data[6] ^ data[7] ^ crc_reg[30] ^ data[1] ^
                        crc_reg[15] ^ crc_reg[24] ^ crc_reg[25];

  assign next_crc[24] = crc_reg[26] ^ data[5] ^ data[6] ^ data[0] ^
                        crc_reg[31] ^ crc_reg[16] ^ crc_reg[25];

  assign next_crc[25] = data[4] ^ crc_reg[17] ^ crc_reg[26] ^ data[5] ^
                        crc_reg[27];

  assign next_crc[26] = data[4] ^ crc_reg[18] ^ crc_reg[27] ^ crc_reg[28] ^
                        data[7] ^ crc_reg[30] ^ data[1] ^ crc_reg[24] ^
                        data[3];

  assign next_crc[27] = data[6] ^ crc_reg[19] ^ crc_reg[28] ^ crc_reg[29] ^
                        data[0] ^ crc_reg[31] ^ data[2] ^ data[3] ^
                        crc_reg[25];

  assign next_crc[28] = crc_reg[26] ^ data[5] ^ crc_reg[20] ^ crc_reg[29] ^
                        crc_reg[30] ^ data[1] ^ data[2];

  assign next_crc[29] = data[4] ^ crc_reg[27] ^ crc_reg[21] ^ crc_reg[30] ^
                        data[0] ^ data[1] ^ crc_reg[31];

  assign next_crc[30] = crc_reg[28] ^ data[0] ^ crc_reg[22] ^ crc_reg[31] ^
                        data[3];

  assign next_crc[31] = crc_reg[29] ^ crc_reg[23] ^ data[2];



assign crc = ~{crc_reg[0], crc_reg[1], crc_reg[2], crc_reg[3], crc_reg[4], crc_reg[5],
              crc_reg[6], crc_reg[7], crc_reg[8], crc_reg[9], crc_reg[10], crc_reg[11],
              crc_reg[12], crc_reg[13], crc_reg[14], crc_reg[15], crc_reg[16], crc_reg[17],
              crc_reg[18], crc_reg[19], crc_reg[20], crc_reg[21], crc_reg[22], crc_reg[23],
              crc_reg[24], crc_reg[25], crc_reg[26], crc_reg[27], crc_reg[28], crc_reg[29],
              crc_reg[30], crc_reg[31]};

endmodule




module mac_transmite_tb;

reg tx_clk;
reg reset_n;
wire [3:0]tx_data;
wire tx_valid;
mac_transmite u2(
.i_tx_clk(tx_clk),
.i_reset_n(reset_n),
.o_tx_data(tx_data),
.o_tx_en(tx_valid)
);
always #20 tx_clk=~tx_clk;

initial
begin
$vcdpluson;
end
initial begin
tx_clk=0;
reset_n=0;
#50;
reset_n=1;
#1e7;
#10 $finish;
end

endmodule

 


作者于2017-09-29 16:23:14修改!
楼主可见

  1. shwnyoo 1#

    您好,网表仿真记为后仿真与前仿真的波形是不一样的?可否提供相关文件?