在verilog中的if条件下编译时间常数

时间:2014-07-03 10:38:59

标签: verilog system-verilog

这是编辑过的。我收到 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

3 个答案:

答案 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的高级主题,最好避免使用它们,直到您更熟悉该语言的基础知识。