Как получить защелку с назначением блокировки? - PullRequest
0 голосов
/ 09 апреля 2020

Мой вопрос подчеркивает поправку к элементу структуры!

struct packed {
    logic        word;
    logic [31:0] test;
} a;
logic [32:0] a_input;
logic a_ff;

always_latch begin
  if (enable) begin
    a = a_input;          // map the bus `a_input` to the struct `a`
    a.test = a.test[1:0]; // change the `test` child
  end
end

wavedrom

  • enable и a_input перевернуты провалы на одних и тех же часах (в физическом оборудовании они могут достигнуть защелки в разное время)
  • a - это модифицированная версия a_input

Вивадо не делает Синтезировать это как защелку.

Я хочу изменить только a.test, a_input не является структурой, тогда я не могу использовать a_input.test. Тогда этот код хорошо описывает то, что я хочу сделать.

Как получить защелку?

Редактировать: Я могу использовать сочетание always_comb, always_ff и assign.

struct packed {
    logic        word;
    logic [31:0] test;
} a, a_comb;
logic [32:0] a_input;
logic a_ff;

always_ff @(posedge clk)
  if (enable) begin
    a_ff <= a_comb;
end
always_comb begin
  a_comb = a_input;               // map the bus `a_input` to the struct `a_comb`
  a_comb.test = a_comb.test[1:0]; // change the `test` child
end
assign a = (enable)? a_comb: a_ff;

Я бы хотел избежать этих лишних строк и временных логик, это должно быть возможно с использованием простых always_latch.

Редактировать # 2:

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

Если бы это был FF, он бы сделал:

always_ff @(posedge clk)
  if (enable) begin
    a      <= a_input;     // map the bus `a_input` to the struct `a`
    a.test <= a.test[1:0]; // change the `test` child
  end
end

Я хочу преобразовать эти логи c в защелку вместо FF.

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

Защелка является регистром, чувствительным к уровню, а не краем. Драйвер включения не показан, поэтому Vivado может привести его к 0. Быстрый пример, если вы пытаетесь сделать защелку, следующее должно сделать это.

always@(enable) begin
   a = enable ? a_input : a;
end

Как правило, мы стремимся избегать защелок, но если вы не готовы сделать одну, вы можете начать, избавившись от posedge clk из списка чувствительности и изменив его на *. Это будет означать, что при любом изменении сигналов вы получите переоценку блока. Тот факт, что enable будет управлять загрузкой члена a_ff, когда он высокий, а затем будет удерживать значение при низком уровне, следует рассматривать как защелку, при условии, что разрешение запускается из некоторого источника и не оптимизируется до состояния с постоянным 0, потому что это сигнал без извлечения. .

0 голосов
/ 21 апреля 2020

Сначала убедитесь, что простая защелка будет синтезироваться как защелка. Если это не так, то это отдельная проблема, и вам нужно будет разобраться; проверьте версию синтезатора и целевое устройство.

always_latch
  if (enable)
    a <= a_input;

Я не уверен, почему ваша защелка не работает. Защелки должны быть простыми, чтобы предотвратить непреднамеренную сложную обратную связь. Ваш код выглядит достаточно простым, поскольку единственное, что он делает за пределами базового c D-защелки, это маскирует некоторые биты.

Если предположить, что защелка basi c синтезируется правильно, вы можете сделать комбинационную логику c до или после защелки. Пример:

always_comb begin
  a_comb = a_input;
  a_comb.test = a_comb.test[1:0];
end
always_latch
  if (enable)
    a <= a_comb;

или:

always_latch
  if (enable)
    a_lat <= a_input;
always_comb begin
  a = a_lat;
  a.test = a.test[1:0];
end

Если вы только маскируете биты, вы можете использовать:

always_latch
  if (enable)
    a <= a_input & 32'h100000003;

Если три выше не не работает, но простая защелка работает правильно, тогда это может быть связано с оптимизацией. В этом случае убедитесь, что a_input и enable являются FF и являются функционально переключаемыми (ie не оптимизирован, потому что делают что-то еще выше). Также проверьте, как a начинает использоваться вниз по течению.

0 голосов
/ 09 апреля 2020

Я пробовал этот код в Vivado, он может синтезировать его в защелку LDCE.

   module latch (
        input  logic  a_input,enable,
        output logic  a
    );

        always_latch if(enable) a = a_input;

    endmodule
...