我正在尝试使用矢量参数实现触发器:
如果N [i] = 1,则代码将实现物理翻转,
如果N [i] = 0,则代码不会实现物理翻转。
parameter N= 4'b0101;
reg [3:0] out ;
genvar i;
generate
for (i=0; i<4; i=i+1) begin : FF_GEN
if (N[i])
begin
always @(posedge clk)
out[i] <= in[i];
end
else
begin
always @(*)
begin
out[i] = /*in[i] &*/ 1'b0; // without 'in' sim scheduler shouts
end
end
endgenerate
问题:
答案 0 :(得分:-1)
使用位向量来生成寄存器(或不是)很好。
您始终可以指定一个零,这使得寄存器在优化期间将消失:
for (i=0; i<4; i=i+1) begin : FF_GEN
always @(posedge clk)
out[i] <= N[i] ? in[i] : 1'b0;
end
可能有些工具不喜欢你使用(*)因为他们开始寻找右侧变量而失败。 在这种情况下,您可以使用“in”作为敏感度列表。
for (i=0; i<4; i=i+1) begin : FF_GEN
if (N[i])
always @(posedge clk)
out[i] <= in[i];
else
always @(in) // or ( * ) but that might not always work
out[i] <= 1'b0;
end
我能想到的最短形式根本不需要生成:
always @(posedge clk)
out <= in & N;
发布编辑:
在最短的形式中,我依靠综合工具来识别某些位的结果总是为零,从而优化寄存器。
这可以防止,但你必须专门添加合成指令以保持它们。