always 进程中的优先级问题
第一种情况是使用IF ELSE语句 这样有优先级如下代码:
always @(posedge clk)
begin
if(!rst_n)
begin
addr <= 0 ;
end
else
begin
if(ce1 == 1'b1)
begin
addr <= 8'd1 ;
end
else if(ce2 == 1'b1)
begin
addr <= 8'd2 ;
end
else if(ce3 == 1'b1)
begin
addr <= 8'd3 ;
end
else if(ce4 == 1'b1)
begin
addr <= 8'd4 ;
end
else if(en == 1'b1)
begin
addr <= addr + 8'd1 ;
end
else ;
end
end
endmodule
第二种情况是:在always里面使用几个平行的 if else 代码如下:
always @(posedge clk)
begin
if(!rst_n)
begin
addr <= 0 ;
end
else
begin
if(ce1 == 1'b1)
begin
addr <= 8'd1 ;
end
else if(en == 1'b1)
begin
addr <= addr + 8'd1 ;
end
else ;
end
if(!rst_n)
begin
addr <= 0 ;
end
else
begin
if(ce2 == 1'b1)
begin
addr <= 8'd2 ;
end
else if(en == 1'b1)
begin
addr <= addr + 8'd1 ;
end
else ;
end
if(!rst_n)
begin
addr <= 0 ;
end
else
begin
if(ce3 == 1'b1)
begin
addr <= 8'd3 ;
end
else if(en == 1'b1)
begin
addr <= addr + 8'd1 ;
end
else ;
end
if(!rst_n)
begin
addr <= 0 ;
end
else
begin
if(ce4 == 1'b1)
begin
addr <= 8'd4 ;
end
else if(en == 1'b1)
begin
addr <= addr + 8'd1 ;
end
else ;
end
end
endmodule
请问大虾们这两个情况有何区别,那个更好些。
前一种写法,优先级从高到低依次是:ce1 ce2 ce3 ce4 en
后一种写法,优先级从高到低依次是:ce4 en ce3 ce2 ce1(如果你想问为什么,答案是因为代码是顺序执行的。)
两种写法除了可读性以外,没有好坏的差别。
第二种写法也太那个 啥啥啥 ,第一次见这种写法。
哈哈 我自己瞎想滴 二楼说的没错 但是第二种写法优先级从高到低应该是:ce1 en ce2 ce3 ce4
第二种写法优先级从高到低应该是:ce1 en ce2 ce3 ce4
既然顺序应该首先是ce1 en 再是ce2 en
##第二种方法可行,但是相当不直观,
第二种写法,因为最后的赋值语句决定了信号的最终值,所以后面的优先级反而高。
第二种写法是只是仿真性的代码,没有实际意义。综合会形成多驱动。
多谢大虾 看你的分析雾水头清
应该不会多驱动吧 都在一个进程里面
我还是没有理解第二中
正如8楼所说,第二种没多大实际意义。建议设计中别用。留给大学的老师、研究生写书、写论文用,可以提高大学排名。
综合器是不管程序块的结构的。写在一个always块里与写在多个always块里是等效的。
所谓进程只在仿真器中存在。
第二种与仿真器有关
路过,眼睛都被看晕了
第二种不用else的if由于后面的语句对前面语句有覆盖作用,优先级后面的会更高。
我觉得综合下来的情况可能和不同综合工具有关吧
第二种写法严重不推荐。第一种写法如果各个if的条件互斥的话,有可能综合成没有优先级的电路。
尝试下这种写法,清晰直观,跟第一种效果一样,
不过可能不同编译器结果会不一样
case(1'b1)
ce1: add <= 8'd1;
ce2: add <= 8'd2;
ce3: add <= 8'd3;
ce4: add <= 8'd4;
en : add <= add + 8'd1;
default: add <= add;
endcase
跟软件一个样
