Как Verilog интерпретирует умножение на один бит? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть условная 2-битная переменная. Исходя из ее значения, текущее значение увеличивается или уменьшается.Под этим я подразумеваю:

module verilog_block(clk, cond, incr, curr_val)
input clk;
input [1:0] cond;
input [5:0] incr;
output reg [5:0] curr_val;

always @ posedge(clk)
begin
curr_val <= curr_val + (!cond[1] - cond[1]) * incr * cond[0];
end

endmodule

Извините, если я допустил какие-либо ошибки, я не проверял этот конкретный код, так как я просто пытаюсь проиллюстрировать свой вопрос.Если cond[0]==0, я не хочу менять curr_val (независимо от cond[1]).Если cond[1]==1, я хочу, чтобы curr_val уменьшилось на incr, а если cond[1]==0, я хочу, чтобы curr_val увеличилось на incr.

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

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

1 Ответ

2 голосов
/ 23 сентября 2019

Любой хороший инструмент синтеза оптимизирует умножение там, где это возможно, особенно когда оно включает умножение на ноль или любую степень 2. Но вы создали очень сложную для чтения операцию.Почему бы не написать так, как вы сказали:

always @ posedge(clk)
  begin
     if (cond[0]==1) 
       curr_val <= curr_val + (cond[1]==1) ? -incr : incr;
end
...