Verilog присваивает только часть элемента массива - PullRequest
0 голосов
/ 10 октября 2018

У меня есть модуль, который мне нужно ОЧЕНЬ много копий, поэтому для упрощения кода я использую индексированный массив (делал это раньше много раз).Но в этом случае шина, которая связана с моим устройством, короче, чем мой массив, поэтому я должен читать / писать из элементов массива по частям.Я не смог найти элегантный способ сделать это (не верю, что приведенный ниже код будет работать).Я могу разбить массивы на куски, но это делает перестройку его в пригодные для использования переменные болезненными (как для модуля, так и для модуля).Есть мысли о том, как мне это сделать?

Спасибо, Дейв.

module xMain(
   input  wire          clk48M,                 // System clock
   inout  wire [7:0]    ucDb,                   // Data bus value
   input  wire          ucMsb,                  // Variable Lsb/Msb
   input  wire          ucAd,                   // Module address
   input  wire          ucRdb,                  // Micro read\
   input  wire          ucWrb,                  // Micro write\
   input  wire          ucCsb                   // Micro chip select\
);

reg   [7:0] UcOut;                              // Output register
reg  [13:0] ModInp [1:0];                       // Module input
wire [15:0] ModOut [1:0];                       // Module output

assign ucDb    = (!ucCsb && !ucRdb  &&  ucWrb)  ? UcOut : 8'bz;

xModule U1 ( .modClk(clk48M), .inVal(ModInp[0]), .outVal(ModOut[0]) );
xModule U2 ( .modClk(clk48M), .inVal(ModInp[1]), .outVal(ModOut[2]) );

always @( posedge clk48M )
begin
   if ( !UcCsb && UcRdb && !UcWrb ) begin
      if ( ucMsb ) begin
         ModInp[ucAd][13:8] <= ucDb[5:0];
      end
      else begin
         ModInp[ucAd][7:0] <= ucDb;
      end
   else if ( !UcCsb && !UcRdb && UcWrb ) begin
      if ( ucMsb ) begin
         UcOut <= ModOut[ucAd][15:8];
      end
      else begin
         UcOut <= ModOut[ucAd][7:0];
      end
   end
end
endmodule

// Dummy module shown below
module xModule(
    input  wire         modClk,                 // Module clock
    input  wire [13:0]  inVal,                  // Input value
    output reg  [15:0]  outVal                  // Output value
);

always @( posedge modClk )
begin
   outVal[15]     <= 0;          // do something to the input
   outVal[14]     <= 0;          // to generate an output
   outVal[13:0]   <= inVal;
end
endmodule
...