Использование операторов потоковой передачи в контексте сериализаторов в PHY

#system-verilog

#система-verilog #system-verilog

Вопрос:

У меня есть сериализаторы и десериализаторы 8: 1, основанные на ширине данных в нашем коде RTL.На данный момент мы используем циклы for для загрузки пути данных и чтения пути данных из сериализаторов. Можем ли мы использовать операторы потоковой передачи для этой функциональности.

Я новичок в операторах потоковой передачи, поэтому точно не понимаю, как их использовать в этом контексте.

 input  [8*DATA_WIDTH-1:0] data_from_user; //WRITE DATA 
output [8*DATA_WIDTH-1:0] data_to_user;   //READ DATA
output [7:0]              data_to_phy_serializer     [DATA_WIDTH-1:0];
input  [7:0]              data_from_phy_deserializer [DATA_WIDTH-1:0];

//WRITE DATA PATH FLOW
always@(posedge clk) begin:WRITE_PATH
  for(i = 0 ; i < DATA_WIDTH ; i =  i  1 )
        data_to_phy_serializer[i]  = '{
                                         data_from_user[DATA_WIDTH*7   i],
                                         data_from_user[DATA_WIDTH*6   i],
                                         data_from_user[DATA_WIDTH*5   i],
                                         data_from_user[DATA_WIDTH*4   i],
                                         data_from_user[DATA_WIDTH*3   i],
                                         data_from_user[DATA_WIDTH*2   i],
                                         data_from_user[DATA_WIDTH*1   i],
                                         data_from_user[DATA_WIDTH*0   i]
                                       } ;
  end

//READ DATA PATH FLOW
 always@(posedge clk) begin:READ_PATH
    for(j= 0 ; j < DATA_WIDTH ; j = j   1)begin
      {
       data_to_user[j DATA_WIDTH*7],
       data_to_user[j DATA_WIDTH*6],
       data_to_user[j DATA_WIDTH*5],
       data_to_user[j DATA_WIDTH*4],
       data_to_user[j DATA_WIDTH*3],
       data_to_user[j DATA_WIDTH*2],
       data_to_user[j DATA_WIDTH*1],
       data_to_user[j DATA_WIDTH*0]
      }                         <= #TCQ data_from_phy_deserializer[j] ;
     end
  

входные данные будут представлены в виде 8 объединенных слов данных, и мне нужно отправить данные в PHY для каждого бита данных отдельно, выбрав соответствующие элементы из входных данных.

этот код работает нормально, но единственное сомнение в том, могу ли я использовать операторы потоковой передачи в этом контексте. Пожалуйста, не рассказывайте об основах операторов потоковой передачи, таких как преобразование упакованных в распакованные и наоборот. Мне нужно передавать данные для PHY. если я смогу использовать операторы потоковой передачи в этом контексте, это мне очень поможет.

пример кода для записи пути передачи данных шириной 4 бита в сериализаторы 8:1

    //write data for data width of 4
assign [8*4 -1:0] data = {4'hF,4'hE,4'hD,4'hC,4'hB,4'hA,4'h9,4'h8};

//so now data to each data bit serializer will be
//8:1 data for serializers of
//              bit-- 3-- 2-- 1-- 0
//              4'b___1___1___1___1
//              4'b___1___1___1___0
//              4'b___1___1___0___1
//              4'b___1___1___0___0
//              4'b___1___0___1___1
//              4'b___1___0___1___0
//              4'b___1___0___0___1
//              4'b___1___0___0___0
//  data for serializer of bit 0 is 8'b10101010
//  data for serializer of bit 1 is 8'b11001100
//  data for serializer of bit 2 is 8'b11110000
//  data for serializer of bit 3 is 8'b11111111

assign [7:0] data_to_phy_serializers [3:0] = '{
                                                    8'b11111111,
                                                    8'b11110000,
                                                    8'b11001100,
                                                    8'b10101010
                                              };
  

Комментарии:

1. я думаю, что в обоих случаях мы можем использовать оператор потоковой передачи для упакованных в распакованные и распакованных в упакованные массивы

2. amiq.com/consulting/2017/05/29/…

3. amiq.com/consulting/2017/06/23/…

4. @RAMAKRISHNAMEDA все примеры, на которые вы ссылались, используют только упакованные данные.

5. Вы правы. Потоковая передача работает в обоих направлениях. Я кое-что узнал.

Ответ №1:

Да, вы можете использовать его в обоих случаях.Я думаю, это сработает:

 data_to_phy_serializer = {>>{data_from_user}};
  

и

 data_to_user <= #TCD {>>{data_from_phy_deserializer}};
  

У меня есть небольшой экспериментальный пример, с которым вы можете поиграть.

 module ab;
  logic [3:0][1:0]a;
  logic [3:0]b[1:0];
  logic [3:0][1:0]c;

  initial begin
    a = 8'hAB;
    b = {>>{a}};
    c = {>>{b}};

    $displayh(a,b[1],b[0],c);
  end
endmodule
  

Комментарии:

1. Я думаю, что это не решение в данном контексте, пожалуйста, ознакомьтесь с примером потока данных, который я отредактировал в вопросе. предоставленное вами решение упаковано в распакованное преобразование

2. предоставленное вами решение предоставит данные в виде // 8 ‘b1111_1110 // 8 ‘b1101_1100 // 8 ‘b1011_1010 // 8 ‘b1001_1000, но фактические требуемые данные // 8 ‘b1111_1111 // 8 ‘b1111_0000 // 8 ‘b1100_1100 // 8 ‘b1010_1010

3. @RAMAKRISHNAMEDA вы значительно изменили пример. Итак, ответ больше не применим.

4. Sry для этого я написал модифицированную версию кода, и я понял, что не показал фактическое назначение кода