各位大侠来讨论一个verilog的问题
不同的always里给同一个值赋值,一般是不可综合的,鄙人现在出现了一个这样的问题,,一个always里面的逻辑比较复杂,主要是状态机,当输入是一种很特别的情况时,在同一时刻对某一个变量赋不同值(0和1)了。仿真出来,这个变量总是选择了0.综合后的后仿结果和前仿一致,modelsim和DC都没有报错。
请问:
1、这种同一时刻赋不同值的情况出现的可能性特别特别小,就一个时钟周期的范围,而一个时钟周期相对于本设计的应用是很小很小的,可以忽略,但不知道由此综合出来的电路会不会有很大的潜在问题。或者没有什么大问题,可以跳过它。
2、此逻辑包含状态机a和状态机b,状态机a中给一变量f赋值了,f的值影响状态机b的状态,而b的状态是独立于a的,b中也对f进行赋值了。这种设计问题还是比较大的吧?
文字描述不太清楚,看例子。
例子如下:
always @(posedge clk or negedge rstn)
begin
if(~rstn)
........
else
begin
case(state)
IDLE:
state<=s1;
.........
s1 :
state<=s2;
.......
s2 :
state<=s3;
f<=1;
..........
s3 :
......
state<=s2;
endcase
case(second_state)
ss0: begin
if(f==1'b1)
second_state<=ss1;
else
second_state<=ss0;
end
ss1: begin
.............
second_state<=ss0;
f<=1'b0;
end
endcase
就是在一种特殊情况下,s2向s3跳转,ss1向ss0跳转,这种情况下,f的值就不确定了。这个情况在现实中发生的可能性很小.
希望各位大侠广开言路,只要与本帖子相关,欢迎讨论,谢谢各位了!
是同一个always里面赋值的,同一个always里面有两个状态机,逻辑比较复杂,会出现同一时刻x被赋同一值。
注:是同一个always里面!
这个是语法解释的问题,最终综合出来的电路一个状态下只会给信号一个赋值,就看这个值是不是你想要的了。
只是这样debug起来很困难。
always@(posedge clk or negedge xreset)
if (~xreset)
a <= 1'b0;
else begin
a <= 1'b0; //这种并行的写法类似你说的,在一个always的两个状态机内对同一个信号赋值
if(b==0)begin //一般会编译成 b!=0时a=0,else,b==0时a=1,而不会有冲突。
a<= 1'b1;
end
end
--------------------------------------------
但是会有与设计思想不符的风险。
额,,就你举的这个例子来说。你说可能和设计思想不符。如果编译的结果和我的设计思想是一致的话,,就不会有什么危险了?
“状态机a中给一变量x赋值了,x的值影响状态机b的状态,而b的状态是独立于a的,b中也对x进行赋值了。”
从上面的句子看出,a和b是有关系的,你虽然这么写了,但是未必会a和b两个状态会同时出现吗?如果会,那还要取决于你采用什么赋值方式,如果是阻塞的,则最后一个有效,如果是非阻塞的,好像也是最后一个有效。确实是有风险,不太好分析。
你所说的最后一个是指什么呢?
可以使用。
只要你脑袋里有这个意识,并确认了ok,当然可以使用。
首先,不要以为写在同一个always块里就是一个电路。否则大可以把所有的同时钟电路放到一个always块里了。
一般来说,要求一个always块只完成一个功能。你这2个状态机完全不相关,因此按照coding style是要放在2个always块里,然后编译的时候会告诉你不建议在不同的always块里对同一个变量赋值,这样是有隐患的。除非你能保证这种情况下没有冲突,或者冲突不会导致你系统错误。
恩,,冲突就是同时给它赋零和1,冲突发生时赋零和赋1对我功能没多大影响。这种情况下如何考量这种设计
a影响X, X影响b,所以a与b相关。
你说的a与b独立有问题。
还有推荐一个always只对一个信号控制和赋值。
首先考虑是不是设计思路有问题或者架构问题。
如果不能在这个层次上避免的话,就修改代码。
第一个状态机产生f1,第二个产生f0,然后在新的always块中根据条件输出f。这时候就需要考虑0状态重要还是1状态重要,用if语句产生优先级判断。
这就看你2个赋值同时发生时是否有其他的判断来选择取值,如果没有的话,感觉是否在逻辑上存在问题
若不可避免的会出现这种请况,你的意思是说可以用if语句选择到底赋哪个值?具体如何实现?
if语句有优先级,判断if成功后就不会判断else
小编对数字设计理解还是不够
目前这种状况在规范设计中就是不该存在的问题
你应该想的是怎么避免出现这种描述,而不是这样描述以后影响大不大
思路要清晰 不要舍本逐末
en ..这位大侠说的有道理。
这种有风险,可能会出现你不想要的结果。用if else来做可能会避免,因为有优先级。
小编你可以把对f变量的赋值来到外面来。然后判断啥时候set为1,啥时间被clear,这样不是很清楚的结构吗,干嘛搞的这样混乱,你这样写的style 根本不符合verilog的标准,还是那就话,电路的设计不是靠verilog的,
设计是靠人脑的,verilog只是把你脑中设计好的电路描述出来,一定要弄清楚verilog是硬件描述语言,不是设计语言。你这个不是在两个always快中DC可能不会报,但是你用style check的工具(spyglass)check一下你的代码应该能报出问题来。
好好研究一下
这样做,好危险啊!
既然状态a、b是独立的
就应该独立出来写
通过中间信号来控制状态b的跳转
建議將這兩段code拆成兩個always
同一個always盡可能不要放一些較不相似的code進去較好
一方面可以減少硬體面積
一方面也可避免功能出錯
例外就是建議樓主可以將這幾行CODE加上 #1 delay上去看看
確定再有延遲的狀況下也能正常動作
写在同一个always块里未必是一个电路
yes, although u can get desired output waveform, gate simulation (synthesis) will be not correct, ha, keep it up...
进来看看。
s说的好
电路《---》Verilog, 这不是一个先有鸡还是先有蛋的问题,而是,你一定要有电路,才能写Verilog。如果你不搞清楚要设计模块的功能/时序/接口/状态。试问如何写Verilog。好大的胆子还能写出Verilog,这样的Verilog做出来的芯片失败的概率有多大?
沉下心来,慢慢分析,想清楚了之后下笔就简单多咯,验证也就简单多咯。小编这样可能会导致Synthesis和Simulation不匹配的代码还是三思为妙,三思三思。切勿急功近利。
学习学习
