Как присвоить начальное значение входному регистру: компилятор дизайна удаляет назначение

Я новичок в разработке ASIC. У меня есть дизайн, например, с двумя входами a, b. Я использую следующий код для инициализации этих двух сигналов. Но компилятор дизайна выдает предупреждение о том, что регистр «а» является константой и будет удален. Когда я пытаюсь выполнить симуляцию постсинтеза, все эти два сигнала — «z». Итак, как я могу применить начальное назначение сигнала, чтобы избежать такой проблемы?

always @(posedge(clk) or posedge (rst)) begin
 if (rst) begin
     a<=4d'5;
     b  <=4'd10;
  end
end

person user214497    schedule 23.02.2019    source источник
comment
Вы пропустили точку с запятой после присвоения значения b.   -  person Adhamzhon Shukurov    schedule 23.02.2019
comment
Это пример, основной задачей является способ назначения сигнала   -  person user214497    schedule 23.02.2019


Ответы (1)


При описании аппаратной системы необходимо учитывать, что входные сигналы в ваш модуль поступают от другого модуля/системы, и их значения определяются этими сигналами. Входы любого модуля могут быть только типа wire.

Вы можете думать о модуле как о коробке с входами и выходами. Значения выходных сигналов определяются входным сигналом + логика внутри коробки. Однако модуль не может решить, какими должны быть его входы. Это возможно только при наличии обратной связи, и даже в этом случае она будет зависеть от других сигналов, находящихся вне контроля модуля.

В результате выходные сигналы могут быть объявлены как output reg, но это не так для входов. Однако есть решение вашей проблемы, я думаю, что то, что вы хотите, может быть разработано с использованием следующего метода:

module your_module(
input clk,
input rst,
//other inputs and outputs that you might need
input [3:0] a,
input [3:0] b
);
//define registers 
reg [3:0] a_register;
reg [3:0] b_register;
/* 
These registers are defined to make it possible to
to give any value to that logics when posedge rst 
is detected, otherwise you can use them as your
input logics
*/ 
//use initial block if you need
always@(posedge clk or posedge rst) begin
  if(rst) begin
    a_register <= 4'd5;
    b_register <= 4'd10;
  end
  else
    begin
      a_register <= a;
      b_register <= b;
      // and use a_register and b_register as you want to use a and b
    end
end
endmodule
person Adhamzhon Shukurov    schedule 23.02.2019
comment
Спасибо за ответ. Но я не хочу определять a и b как входные порты. потому что изначально они представляют собой двумерные массивы 40*64. Я просто хочу [локально в дизайне, определив регистры] дать им начальное значение. Я имею в виду, что у меня нет другого варианта start . Когда я скомпилирую его с предупреждением компилятора дизайна, регистр является константой и будет удален, появится всплывающее окно. - person user214497; 23.02.2019
comment
Затем вы можете инициализировать каждую строку из них по отдельности или использовать «readmemb» или «readmemh». - person Adhamzhon Shukurov; 24.02.2019
comment
Не уверен, какой синтезатор вы используете, но если вы подумаете логически, это должно быть возможно. Большинство инструментов синтеза FPGA могут это сделать. Проверьте stackoverflow.com/questions/4321067/ - person Adhamzhon Shukurov; 25.02.2019