wire [9:0] data_reg;
reg [3:0] Reverse_Count = 8; //This register is derived in logic and I need to use it in following logic in order to reverse the bit position.
assign data_reg[9:0] = 10'h88; // Data Register
genvar i;
for (i=0; i< Reverse_Count; i=i+1)
assign IReg_swiz[i] = IReg[Reverse_Count - 1 -i];
这会产生语法错误。我可以在verilog
中知道如何做到这一点答案 0 :(得分:2)
如果你有Reverse_Count
为常数,那么你的任务归结为只是电汇混合,这在HDL中基本上是免费的。
在您的情况下,可以很好地将任务简化为首先镜像宽数据,然后移位Reverse_Count
以获得其位置上的LBS位,这本身仅由一对N对1多路复用器完成。
integer i;
reg [9:0] reversed;
wire [9:0] result;
// mirror bits in wide 10-bit value
always @*
for(i=0;i<10;i=i+1)
reversed[i] = data_reg[9-i];
// settle LSB on its place
assign result = reversed>>(10-Reverse_Count);
答案 1 :(得分:0)
Reverse_Count
不是常数,即它不是parameter
或localparam
。
这意味着您将根据需要创建和销毁硬件的generate语句,这在verilog中是不允许的,因为它在硬件中是不可能的。
您的反转在编译时应具有固定宽度的总线,应该可以将Reverse_Count声明为参数。
答案 2 :(得分:0)
由于Reverse_Count
dunamic的值,您不能使用generate语句。您可以使用带循环的always块。要进行综合,for循环需要能够静态展开。要确定哪些位反转,请使用if条件来比较索引值和Reverse_Count
示例:
parameter MAX = 10;
reg [MAX-1:0] IReg_swiz;
integer i;
always @* begin
for (i=0; i < MAX ; i=i+1) begin
if (i < Reverse_Count) begin
IReg_swiz[i] = IReg[Reverse_Count - 1 -i];
end
else begin
// All bits need to be assigned or complex latching logic will be inferred.
IReg_swiz[i] = IReg[i]; // Other values okay depending on your requirements.
end
end
end
答案 3 :(得分:-2)
你可以在这里做类似这样的代码: http://www.edaplayground.com/x/4FJ