这是编辑过的。我收到 k不是常数的错误。 pa 是应该针对k 的第i位调用的模块。 k是模块的输入。 pd 模块应该针对k 的所有 i位进行。这是一种加密算法。这里的问题是我写的代码。我怎样才能使它合成? k不能是输入参数吗?感谢@qiu以前的编辑。
module pm(
input [6:0] Ux,
input [6:0] Uy,
input [6:0] Uz,
input [9:0] k,
input clk,
input reset,
output reg [6:0] Wx,
output reg [6:0] Wy,
output reg [6:0] Wz );
wire [6:0] a1x,a1y,a1z,a2x,a2y,a2z;
always @ (Ux,Uy,Uz)
begin
assign Wx=Ux;
assign Wy=Uy;
assign Wz=Uz;
end
genvar i;
generate
for(i=9;i>=0;i=i-1) begin : L1
pd d0(.Xp(Wx),.Yp(Wy),.Zp(Wz),.Xb(a1x),.Yb(a1y),Zb(a1z),.clk(clk),.reset(reset));
always @(a1x,a1y,a1z)
begin
Wx <= a1x;
Wy <= a1y;
Wz <= a1z;
end
if ( k[i] )
begin
pa a0(.Xp(Ux),.Yp(Uy),.Zp(Uz),.Xq(Wx),.Yq(Wy),.Zq(Wz),.Xr(a2x),.Yr(a2y),.Zr(a2z),.clk(clk),.reset(reset));
always @(a2x,a2y,a2z)
begin
Wx <= a2x;
Wy <= a2y;
Wz <= a2z;
end
end
end
endgenerate
endmodule
答案 0 :(得分:0)
if ( k[i] == 1)
在genvar中没有意义
答案 1 :(得分:0)
所有非阻塞分配都应位于始终/初始块中:
Wx <= a1x;
Wy <= a1y;
Wz <= a1z;
答案 2 :(得分:0)
将寄存器/端口写为[6:0]而不是[0:6]更为常见。
输入不能为reg
。
假设您没有坚持使用Verilog-95端口列表,则不必写出两次:
module pm(Ux,Uy,Uz,k,Wx,Wy,Wz,clk,reset);
input [0:6] Ux,Uy,Uz;
input reg[0:9] k;
input clk,reset;
output [0:6] Wx,Wy,Wz;
可以来:
module pm(
input [6:0] Ux,
input [6:0] Uy,
input [6:0] Uz,
input [9:0] k,
input clk,
input reset,
output [6:0] Wx
output [6:0] Wy,
output [6:0] Wz
);
在编写verilog RTL时,我们可以暗示组合逻辑always @*
或assign
。暗示触发器always @(posedge clk ...
或实例化模块。
您有许多Wx <= a1x;
形式的陈述不适合上述陈述,它们需要由定义其行为的always
包含。
Verilog描述硬件,真实物理电子学, K是输入,这意味着以下部分:
if ( k[i] == 1 ) begin
pa a0(.Xp(Ux),.Yp(Uy),.Zp(Uz),.Xq(Wx),.Yq(Wy),.Zq(Wz),.Xr(a2x),.Yr(a2y),.Zr(a2z),.clk(clk),.reset(reset));
动态创建和销毁硬件,这是不可能的。如果语句可以像这样使用,但条件必须是编译时常量。
生成循环是Verilog的高级主题,最好避免使用它们,直到您更熟悉该语言的基础知识。