这是允许的吗?
input w;
input [8:0]y;
output reg [8:0]x;
always@(w)
begin
//x[0] or A is never on in any next state
assign x[0] = 0;
assign x[1]= (y[0]&~w) | (y[5]&~w) | (y[6]&~w) | (y[7]&~w) | (y[8]&~w); //B
assign x[2]= (y[1]&~w); //C
assign x[3]= (y[2]&~w); //D
assign x[4]= (y[3]&~w) | (y[4]&~w); //E
assign x[5]= (y[0]&w) | (y[1]&w) | (y[2]&w) | (y[3]&w) | (y[4]&w); //F
assign x[6]= (y[5]&w);
assign x[7]= (y[6]&w);
assign x[8]= (y[7]&w) | (y[8]&w);
end
Run Code Online (Sandbox Code Playgroud)
你可以,它被称为"程序性连续分配".它覆盖了普通的程序分配,似乎没有在您发布的代码中调用它们.我不确定它们是否可合成,但无论如何我都没有理由使用它们.
关于您的代码的注释 - 您y的敏感性列表中缺少:例如always @( w or y )或always @(*)更安全.
根据Marty的回答,您应该阅读IEEE Verilog标准(例如1364-2005)的9.3节,其中描述了"程序连续分配".规范允许块assign内的语句always.但是,根据我的经验,这是非常罕见的.
您的代码的另一个问题是它尝试使用两个不同的模拟器编译错误.两者都生成错误消息,在分配的左侧不能使用位选择或部分选择.
另一种可能的解决方案是摆脱always块,只使用简单的连续分配.
input w;
input [8:0] y;
output [8:0] x;
assign x[0] = 0;
assign x[1]= (y[0]&~w) | (y[5]&~w) | (y[6]&~w) | (y[7]&~w) | (y[8]&~w); //B
assign x[2]= (y[1]&~w); //C
assign x[3]= (y[2]&~w); //D
assign x[4]= (y[3]&~w) | (y[4]&~w); //E
assign x[5]= (y[0]&w) | (y[1]&w) | (y[2]&w) | (y[3]&w) | (y[4]&w); //F
assign x[6]= (y[5]&w);
assign x[7]= (y[6]&w);
assign x[8]= (y[7]&w) | (y[8]&w);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30757 次 |
| 最近记录: |