Можете ли вы использовать / манипулировать одной и той же переменной output / reg в нескольких блоках всегда? - PullRequest
0 голосов
/ 31 мая 2018
always @ (posedge clk) begin     
  if (x) begin 
    count <= count + 1'b1;
  end    
end

always @ (posedge clk) begin     
  if (y) begin 
    count <= count - 2'b10;
  end    
end

always @ (negedge clk) begin     
  if (x) begin 
    count <= count - 1'b1;
  end    
end

always @ ( count ) begin 
  ...do something... ;   
end
  • Могу ли я использовать счетчик переменных в множественном блоке всегда?
  • Это хорошая практика дизайна?
  • Почему / Где следует / не следует использовать этот метод?
  • Как симулятор / синтезатор выполняет вычисления для этой переменной 'count'?
  • Выдает ли компилятор ошибку, если я это делаю?

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Я не дизайнер аппаратных средств, но это не хорошо.Все ваши блоки 3 always будут выводить регистр, и все они будут управлять сигналами count.

Вы можете читать сигналы в нескольких блоках, но записывать их следует только водин блок.

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

Микширование posedge и negedge не очень хорошая идея.

В одном блоке вы можете написать что-то вроде этого (подходящий макрос или параметр для UP1, DOWN1 и DOWN2).

always @(posedge clk or negedge reset_n)
begin
    if (reset_n == 1'b0)
    begin
        count <= 32'b0;
    end
    else
    begin
        case (count_control)
            UP1: count <= count + 1'b1;
            DOWN2: count <= count - 2'b10;
            DOWN1: count <= count - 1'b1;
        endcase
    end
end
0 голосов
/ 05 июня 2018

Нет.Вы не можете иметь назначения для сети из нескольких блоков всегда.

Вот результат синтеза 2-х реализаций в Synopsys Design Compiler

НАЗНАЧЕНИЯ ИЗ НЕСКОЛЬКИХ ВСЕГДА БЛОКА.

module temp(clk, rst, x, y, op);
  input logic clk, rst;
  logic [1:0] count;
  input logic x, y;
  output logic [1:0] op;

  assign op = count;

  always @ (posedge clk) begin     
    if (x) begin 
      count <= count + 2'd1;
    end    
  end

  always @ (posedge clk) begin     
    if (y) begin 
      count <= count - 2'd2;
    end    
  end

  always @ (negedge clk) begin     
    if (x) begin 
      count <= count - 2'd1;
    end    
  end
endmodule

// Synthesis Result of elaborate command - 
Error:  /afs/asu.edu/users/k/m/s/kmshah4/temp/a.sv:16: Net 'count[1]' or a directly connected net is driven by more than one source, and not all drivers are three-state. (ELAB-366)
Error:  /afs/asu.edu/users/k/m/s/kmshah4/temp/a.sv:16: Net 'count[0]' or a directly connected net is driven by more than one source, and not all drivers are three-state. (ELAB-366)

НАЗНАЧЕНИЯ С ОДНОМ ВСЕГДА БЛОКОМ.

module temp(clk, rst, x, y, op);
  input logic clk, rst;
  logic [1:0] count;
  input logic x, y;
  output logic [1:0] op;

  assign op = count;

  always @ (clk)
  begin
    if (clk)
    begin
      case ({x, y})
        2'b01 : count <= count - 2'd2;
        2'b10 : count <= count + 2'd1;
        default : count <= count;
      endcase
    end
    else
    begin
      count <= (x) ? (count - 2'd1) : count;
    end
  end
endmodule

// Synthesis Result of elaborate command - 
Elaborated 1 design.
Current design is now 'temp'.
1
0 голосов
/ 31 мая 2018

Могу ли я использовать счетчик переменных внутри нескольких блоков всегда?

В коде RTL нет.

Это хорошая практика проектирования?

«Хорошая практика проектирования» не является четко определенным термином.Вы можете использовать его на тестовом стенде, но не в том формате, который вы используете.В этом случае вы должны убедиться, что все условия всегда взаимоисключающие.

Почему / Где не следует / не следует использовать этот метод?

Вы можете использовать его, если у вас есть около 10 лет опыта в написании кода.В противном случае не .Что касается «следует» никогда!

Как симулятор / синтезатор выполняет вычисления для этой переменной 'count'?

Синтезатор откажется от вашего кода.Симулятор назначит значение так, как вы описали.Что в вашем коде означает: вы не знаете, какое присваивание выполняется последним, поэтому результат непредсказуем.

Выдает ли компилятор ошибку, если я это делаю?

Почемуспросить можно ли попробовать?

...